c - 意外结果,Gnu C 中的三元运算符

标签 c conditional-statements ternary-operator ternary operator-precedence

所以 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/

相关文章:

c - 在C中获取二进制目录

c++ - 为什么这个 o/P...服务器上传失败

c - 基本的 C 头文件语法

c - C语言K&R中的atoi函数

c - 指向函数的指针 - 一种不同的声明方法

c# - 这种行为叫什么?

macos - 当单元格具有特定单词时突出显示 excel mac 2011 中的行

r - 有条件地将一个向量乘以另一个 r

PHP:是否有可能以某种方式将 HTML 嵌入到三元运算符的中间?

c++ - 倒序排序。 "Don' t 重复你自己”规则