首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么("Maya“== "Maya")在C++中不是真的?

为什么("Maya“== "Maya")在C++中不是真的?
EN

Stack Overflow用户
提问于 2010-07-22 03:43:54
回答 8查看 2.1K关注 0票数 24

你知道为什么这段代码会导致"Maya不是Maya“吗?

代码语言:javascript
运行
复制
if ("Maya" == "Maya") 
   printf("Maya is Maya \n");
else
   printf("Maya is not Maya \n");
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-07-22 03:45:26

因为你实际上是在比较两个指针--例如,使用下面的其中一个:

代码语言:javascript
运行
复制
if (std::string("Maya") == "Maya") { /* ... */ } 
if (std::strcmp("Maya", "Maya") == 0) { /* ... */ }

这是因为C++03,§2.13.4说:

普通字符串文字的类型为“

of nconst char

..。在您的情况下,将应用到指针的转换。

另请参阅this question,了解为什么在这种情况下不能为==提供重载。

票数 48
EN

Stack Overflow用户

发布于 2010-07-22 03:45:12

您不是在比较字符串,而是在比较指针地址相等性。

更明确地说-

"foo baz bar“隐式定义了一个匿名const char[m]。它是由实现定义的,即相同的匿名const charm是否会指向内存中的相同位置(这个概念被称为interning)。

您想要的函数-在C中-是strmp(char*,char*),它在相等时返回0。

或者,在C++中,您可能会这样做

#include <string>

std::string s1 = "foo"

std::string s2 = "bar"

然后将s1与s2与==运算符进行比较,后者是以一种直观的方式为字符串定义的。

票数 18
EN

Stack Overflow用户

发布于 2010-07-22 03:49:09

程序的输出是由实现定义的。

字符串文字的类型为const char[N] (即,它是一个数组)。程序中的每个字符串是否由唯一的数组表示是由实现定义的。(§2.13.4/2)

在进行比较时,数组会衰减为指针(指向第一个元素),然后进行指针比较。如果编译器决定将两个字符串字面值存储为同一数组,则指针将比较true;如果它们各自有自己的存储空间,则它们将比较false。

要比较字符串的,请使用std::strcmp(),如下所示:

代码语言:javascript
运行
复制
if (std::strcmp("Maya", "Maya") == 0) // same

通常,您将使用标准字符串类std::string。它定义了operator==。要使用该运算符,您需要将一个文字设为std::string

代码语言:javascript
运行
复制
if (std::string("Maya") == "Maya") // same
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3303164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档