所以三元运算符的运算符优先级为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++ 三元条件和赋值运算符优先级 https://stackoverflow.com/questions/7499400/c-ternary-conditional-and-assignment-operator-precedence
三元运算符求值顺序 https://stackoverflow.com/questions/1445274/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;
我真的会感到震惊。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)