为什么b [2]为假?


11
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

b[] = {true, true, false};

为什么是b[2]假的?

如果A==BA==C,那不意味着B==C



我现在看到了自己的错误,并且我感觉到似曾相识了,因为这不是我第一次感到困惑来比较指针。
NoComprende

Answers:


14

在这个表达中

s.c_str()==""

比较了两个指针(地址)。第一个是指针返回的指针s.c_str(),第二个是指向字符串常量的第一个字符(确定为零字符)的指针""

显然地址是不同的(还要记住,字符串文字具有静态的存储持续时间)。

为了获得预期的结果,您应该写

std::strcmp( s.c_str(), "" ) == 0

至于这两个表达

s==""

s==s.c_str()

然后比较字符串,因为标准类std :: string的运算符==重载了正确的操作数。


在最后一种情况下,标准是否保证指针不同?我知道他们可以。
杰弗里

只能添加它应该是UB。“与字符串文字进行比较会导致未指定的行为”
Roout

@Jeffrey可以保证,因为至少字符串为空。:)但是无论如何,类std :: string使用其构造函数的参数副本。
弗拉德(Flad),来自莫斯科,

1
@Roout-“ UB”表示未定义的行为“。这意味着语言定义不会告诉您**程序的行为。具有未定义的行为的程序不是有效的C ++程序。”未指定的行为“表示有几个备选方案,而且标准不告诉你其中哪些将被选择的方案是有效的,并且实现可以选择任何替代的。
皮特贝克尔

@PeteBecker带有UB的程序仍然有效的C ++程序(至少在某种意义上说,它可以成功编译并可以运行)。
小车813
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.