结果打印出'c'3次,有人知道它为什么总是满足第一个条件吗?
#include <iostream>
using namespace std;
char x(char y)
{
if (y == 'a' || 'b')
{
return 'c';
}
else if (y == 'c' || 'd')
{
return 'e';
}
else
{
return 'g';
}
}
int main()
{
cout << x('a') << endl;
cout << x('c') << endl;
cout << x('p') << endl;
return 0;
}
答案 0 :(得分:8)
你需要一些形式
if (y == 'a' || y == 'b')
这是因为在这个表达式中
(y == 'a' || 'b')
您正在评估y == 'a'
和'b'
的OR,并且由于'b'
由于非零而评估为true
,因此整个表达式的计算结果为{{ 1}}。
true
答案 1 :(得分:6)
这一行:
if (y == 'a' || 'b')
相当于:
if ((y == 'a') || ('b'))
这是因为==
运算符的higher precedence运算符比||
运算符高。{/ p>
由于'b'
非零,因此它总是计算为true,因此(y == 'a' || 'b')
总是计算为真。
你需要写下这个:
if (y == 'a' || y == 'b')
当然,即使优先权是相反的,
if (y == ('a' || 'b'))
不会是你想要的!
答案 2 :(得分:0)
请在此处检查运营商优先级(优先级):http://en.cppreference.com/w/cpp/language/operator_precedence
在您的情况下,条件表达式为:
(y == 'a' || 'b')
因此,首先评估“y =='a'”部分,这可能是真/假,具体取决于“y”的值。我们将“y =='a'”的值称为“t”。然后表达式被评估为“t ||'b'”在这种情况下,'b'实际上是字符'b'(98)的ASCII码值,它肯定大于0,所以布尔表达式的结果是总是如此。
为了消除由运算符优先级引起的任何歧义,我认为使用括号在评估中明确表达您的优先级是一个好习惯。在你的情况下,正如之前的帖子所建议的,它应该是:
if ((y=='a') || (y=='b'))