有条件不工作,总是返回第一个案例

时间:2013-03-11 20:14:55

标签: c++ operators

结果打印出'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;
}

3 个答案:

答案 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'))