所以 C
中三元运算符的运算符优先级对我来说真的很奇怪。恰当的例子:
#include <stdio.h>
int main ()
{
int i=5;
int j=6;
int k=7;
printf("A: %d\n", i+j+(k!=7)?1:11); //prints 1
printf("B: %d\n", i+j+((k!=7)?1:11)); //prints 22
return 0;
}
这似乎与此处的问题类似:
C++ ternary conditional and assignment operator precedence
Ternary operator evaluation order
作为澄清,我理解括号使它起作用,正如我在原始帖子中的评论所指出的...
我只是想知道为什么语言作者会选择一种很可能欺骗人们的评估方法,而第一个语句似乎可以在编译器方面被格式化为有效。
但是这些问题涉及左侧或类成员内部的运算符,因为这种奇怪的行为发生在 RHS 上。
最佳答案
这里有什么奇怪的?第一部分解读为:
(11 + (k != 7)) ? 1 : 11
第二个解释为
11 + ((k !=7) ? 1 :11)
第一个是由优先级规则引起的(二元运算的优先级高于三元运算符),第二个是通过用括号对表达式进行分组来规避优先级规则。
您的编辑会询问原因,人们通常只能猜测这些原因,除非当时在场的 C 委员会有人过来帮忙。我的猜测是,与使用三元运算符来确定算术表达式的值相比,使用复杂表达式并询问其真值更为常见。我想到了这样的事情:
return (froble() + 3) == 0 ? 23 : 5; // parens for sanity but works without
如果这会被解释为 return (froble() + 3) == 5;
我会非常震惊。
关于c - 意外结果,Gnu C 中的三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9763483/