【问题标题】:Operator precedence and ternary operator运算符优先级和三元运算符
【发布时间】:2023-03-07 05:59:01
【问题描述】:

我在 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 但我认为 a?b:c 返回 b=0 并且 0==0 返回 1。您能解释一下代码吗?

【问题讨论】:

  • 为什么不直接查一下运算符优先级表呢?否则这类问题是没有用的。
  • 如果您知道这是关于优先级的,为什么不使用precedence order 来确定括号的放置位置?

标签: c operator-precedence ternary


【解决方案1】:

条件运算符 (?:) 具有最低优先级之一。特别是它低于==。你的说法是这样的:

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

不是这个:

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

【讨论】:

    【解决方案2】:

    你的条件写得不对。

    在第一个 if 语句中:

      if (a ? b : c == 0)
    

    如果你输入值,那么它就变成了

    if(10 ? 0 : 7 == 0)
    

    意思是,它总是返回0。

    这就是为什么控制转到 else 部分并在那里,它变成了

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

    由于您在此处使用了“=”运算符(c = c),所以它始终为真,因此它打印“2”。

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-19
      • 2015-08-24
      • 1970-01-01
      • 2014-03-25
      • 2018-08-14
      • 2011-06-21
      • 2020-03-05
      相关资源
      最近更新 更多