-1

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

3 回答 3

8

你需要某种形式的东西

if (y == 'a' || y == 'b')

这是因为在这个表达式中

(y == 'a' || 'b')

y == 'a'您正在评估and的 OR 'b',并且由于'b'评估为true非零,因此整个表达式的评估结果为true

(y == 'a' || true)
于 2013-03-11T20:15:36.937 回答
6

这一行:

if (y == 'a' || 'b')

相当于:

if ((y == 'a') || ('b'))

那是因为==运算符的优先级高于||运算符。

由于'b'非零,它总是计算为真,因此(y == 'a' || 'b')总是计算为真。

你需要这样写:

if (y == 'a' || y == 'b')

当然,即使优先顺序相反,

if (y == ('a' || 'b'))

也不会是你想要的!

于 2013-03-11T20:17:02.187 回答
0

请在此处检查运算符优先级(priority):http: //en.cppreference.com/w/cpp/language/operator_precedence

在您的情况下,条件表达式是:

(y == 'a' || 'b')

因此,首先评估“y == 'a'”部分,这可能是真/假,具体取决于“y”的值。让我们将“y=='a'”的值称为“t”。然后表达式被评估为“t || 'b'” 在这种情况下'b'实际上是字符'b'的ASCII码值(98)肯定大于0,所以布尔表达式的结果是总是正确的。

为了消除由运算符优先级引起的任何歧义,我认为使用括号明确表示您在评估中的优先级是一个好习惯。在您的情况下,正如之前的帖子所建议的那样,它应该是:

if ((y=='a') || (y=='b'))
于 2013-03-11T20:32:25.563 回答