C中三元运算符的语法



我在大学有一次 C 考试,我正在浏览前几年的考试,我偶然发现了这个问题: 执行以下序列后d的值是多少?

int a=36, b=20, c=30, d;
d = c?(a? a: c):(b? c: b);

还有另一个这样的练习,但在那些括号中还有其他表达:

d = (a>b) ? ((a>c)? a: c): ((b>c)? b: c);

我把 2 个代码放在 ChatGPT 中,它告诉我它们被称为三元运算符。

我知道在第二个示例中,我们将ab进行比较,ac进行比较,bc进行比较,然后我们根据比较给d一个值。但是在第一个例子中,没有比较,只有变量。此外,测试将在纸上进行,因此我将无法在计算机上运行代码。如何阅读第一个示例的语法,这是什么意思?我是否仍在比较 3 个变量,还是有所不同?

我在两个练习的CodeBlocks和VS上运行代码,具有相同的值(a = 36b = 20c = 30),它们都给了我相同的答案:

d = (a>b) ? ((a>c)? a: c): ((b>c)? b: c); //d = 36

d = c?(a? a: c):(b? c: b); //d was still 36.

我不明白我是如何从第二个练习中得到这个答案的。

这是条件运算符;它根据第一个操作数选择第二个或第三个操作数,这是一个条件。它是一个三元运算符;它有三个操作数。(但函数调用f(a, b)也是如此,操作数fab。不要使用 ChatGPT 获取权威信息。

C 2018 6.5.15 4 指定条件运算符:

计算第一个操作数...仅当第一个操作数比较不等于 0 时,才计算第二个操作数;仅当第一个操作数等于 0 时,才计算第三个操作数;结果是第二个或第三个操作数(以计算者为准)的值,转换为下面描述的类型。

因此,在c?(a? a: c):(b? c: b)中,c被计算,条件操作继续进行:

  • 如果c不为零,则计算(a? a: c)。此操作将继续:
    • 如果a不为零,则计算a
    • 如果a为零,则计算c
  • 如果c为零,则计算(b? c: b)
    • 如果b不为零,则计算c
    • 如果b为零,则计算b

对象标识符(abc)的评估只是产生它的值。由于c不为零,因此选择(a? a: c)。由于a不为零,因此选择aa是36岁。

第一个三元语句:

d = c?(a? a: c):(b? c: b);

等效于这一系列的 if-else:

if (c) {       /* c is non-zero */
if (a)     /* a is non-zero */
d = a;
else   
d = c;
} else { 
if (b)     /* b is non-zero */
d = c;
else   
d = b;
}
<小时 />

第二个:

d = (a>b) ? ((a>c)? a: c): ((b>c)? b: c);

等效于这一系列的 if-else:

if (a > b) {
if (a > c) 
d = a;
else 
d = c;
} else {
if (b > c) 
d = b;
else 
d = c;
}

一些注意事项:

  1. if (a)相当于if (a != 0)
  2. if (!a)相当于if (a == 0
  3. if语句认为任何非零值为真,零为假。仅当条件表达式的计算结果为非零值时,才会输入块。

最新更新