C语言中三元运算符的语法[duplicate]

wlwcrazw  于 2023-01-16  发布在  其他
关注(0)|答案(2)|浏览(115)
    • 此问题在此处已有答案**:

if statement integer(3个答案)
昨天关门了。
我有一个考试在uni从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中,它告诉我它们被称为三元运算符。
我知道在第二个例子中,我们比较abacbc,然后根据比较结果给d一个值。但是在第一个例子中,没有比较,只有变量。而且,测试将在纸上进行。所以我不能在计算机上运行代码,我怎么理解第一个例子的语法,它的意思是什么,我还是在比较这三个变量,还是有什么不同?
我在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.

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

fnx2tebb

fnx2tebb1#

这是条件运算符;它根据它的第一个操作数选择它的第二个或第三个操作数,这是一个条件。它是一个三元运算符;它有三个操作数。(但是函数调用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。

cotxawn7

cotxawn72#

第一个三元语句:

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语句将任何非零值视为true,将零视为false。仅当条件表达式的计算结果为非零值时,才进入该块。

相关问题