我在大学有一次 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 中,它告诉我它们被称为三元运算符。
我知道在第二个示例中,我们将a
与b
进行比较,a
与c
进行比较,b
与c
进行比较,然后我们根据比较给d
一个值。但是在第一个例子中,没有比较,只有变量。此外,测试将在纸上进行,因此我将无法在计算机上运行代码。如何阅读第一个示例的语法,这是什么意思?我是否仍在比较 3 个变量,还是有所不同?
我在两个练习的CodeBlocks和VS上运行代码,具有相同的值(a = 36
,b = 20
,c = 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)
也是如此,操作数f
、a
和b
。不要使用 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
。
- 如果
对象标识符(a
、b
或c
)的评估只是产生它的值。由于c
不为零,因此选择(a? a: c)
。由于a
不为零,因此选择a
。a
是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;
}
一些注意事项:
if (a)
相当于if (a != 0)
。if (!a)
相当于if (a == 0
。if
语句认为任何非零值为真,零为假。仅当条件表达式的计算结果为非零值时,才会输入块。