说我有下一个代码示例:
std::string MyString("Michael");
std::cout << (str.find_first_of('=') == str.find_last_of('=') == str.npos);
前面的代码应该给我1,因为前两个从str成员函数返回的值将是:
4294967295
这也是npos值。 但相反,&#39; 0&#39; 0正在屏幕上打印。
另一个奇怪的事情是下一个代码:
std::string MyString("Michael");
std::cout << (str.find_first_of('=') == str.find_last_of('=')) << std::endl;
std::cout << (str.find_last_of('=') == str.npos) << std::endl;
打印&#39; 1&#39;对于这两个产出。
有人可以解释一下,为什么我不能像上面那样比较3个值?
答案 0 :(得分:5)
你不能像这样连接布尔比较(你可以,但它没有做你想象的那样)。它需要是:
std::cout << (str.find_first_of('=') == str.npos && str.find_last_of('=') == str.npos);
即。两个比较由逻辑AND加入。
答案 1 :(得分:3)
(str.find_first_of('=') == str.find_last_of('=') == str.npos)
这基本上是:
(true == str.npos);
这是false
,因此,为您提供0
。
答案 2 :(得分:2)
更改
std::cout << (str.find_first_of('=') == str.find_last_of('=') == str.npos);
// compares the result of a==b with c
到
std::cout << (str.find_first_of('=') == str.find_last_of('=') && str.find_last_of('=') == str.npos);
// ensures a == b && b == c
此外,您可能自己也非常了解答案(只是尝试将事情联系起来) -
std::cout << (str.find_first_of('=') == str.find_last_of('='))
为您提供1
,当然您知道str.npos = 4294967295
简化事情 -
std::cout << (str.find_first_of('=') == str.find_last_of('=') == str.npos)
更改为
std::cout << (1 == 4294967295)
,结果为0
。
注意 - 专门以first_of
和last_of
比较为例,因为==
跟随从左到右结合性。虽然在你的情况下结果是相同的,无论如何。