C语言操作员

-3 c operators ternary-operator conditional-operator operator-precedence

#include <stdio.h>  

int main() 
{

    int a=-1?2:5 + 8?4:5;
    printf("%d\n",a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以上程序的输出是2.但为什么呢?请解释

Sou*_*osh 5

编写人类可读且易于理解的代码.(至少,尝试...)

 int a=-1?2:5 + 8?4:5;
Run Code Online (Sandbox Code Playgroud)

是相同的

int a = (-1) ? 2 : ( 5 + ( 8 ? 4 : 5) );
Run Code Online (Sandbox Code Playgroud)

参考:运算符优先级

现在,让我们将其与三元运算符条件进行比较,如C11章节§6.5.15中所述,

第一个操作数被评估; 在其评估与第二或第三操作数的评估之间存在一个序列点(以评估者为准).仅当第一个操作数不等于0时才评估第二个操作数; 仅当第一个操作数比较等于0时才评估第三个操作数; 结果是第二个或第三个操作数的值(无论哪个被评估),

所以,在你的情况下,

  • 第一个操作数不等于零
  • 因此,它计算第二个操作数,并返回结果,即操作数的值,并将其存储到赋值运算符的LHS变量中.

  • 我反对将第二种形式称为"人类可读且易于理解" (2认同)