运算符优先级和三元运算符

时间:2012-04-04 08:03:48

标签: c operator-precedence ternary

我在C中遇到问题。

#include<stdio.h>
int main()
{
    int a = 10, b = 0, c = 7;
    if (a ? b : c == 0)
        printf("1");
    else if (c = c || a && b)
        printf("2");
    return 0;
}

此代码打印2但我认为?b:c返回b = 0而0 == 0返回1.您能解释一下代码吗?

2 个答案:

答案 0 :(得分:4)

条件运算符(?:)具有最低优先级之一。特别是它低于==。您的陈述意味着:

if(a ? b : (c == 0)) { ... }

不是这个:

if((a ? b : c) == 0) { ... }

答案 1 :(得分:3)

您的条件写得不好。

在第一个if语句中:

  if (a ? b : c == 0)

如果您输入值,则它变为

if(10 ? 0 : 7 == 0)

表示它始终返回0.

这就是控制进入其他部分的原因,它变成了

else if (7 = 7 || 10 && 0)

因为你在这里使用了“=”运算符(c = c),所以它总是为真,因此它会打印“2”。

现在您希望代码返回“1”,然后以这种方式更改您的if语句。

 if( (a ? b:c) == 0){...}

因为“==”运算符的优先级高于三元运算符。