执行三元运算符

Abh*_*ngh 0 c macros ternary operator-keyword

#include <stdio.h>

#define max(x,y)(x)>(y)?x:y

int main() {
    int i = 10;
    int j = 5;
    int k = 0;
    k == max(i++, ++j);
    printf("%d%d%d ", i, j, k);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道答案.这是11 7 0怎么回事?请帮我执行三元运算符.

hac*_*cks 6

该声明

k==max(i++,++j);  
Run Code Online (Sandbox Code Playgroud)

扩大到

k==(i++)>(j++)?i++:j++;  
Run Code Online (Sandbox Code Playgroud)

请注意,==具有较高的优先级?:操作者,因此上述表达式是等效于

( k == ((i++)>(j++)) )?i++:j++;  
Run Code Online (Sandbox Code Playgroud)

由于(i++)>(j++)true,因此k == ((i++)>(j++))被评价为false,因此j++(和它的值成为7)将被评估(i++将被跳过).


注意:上述表达式不会调用未定义的行为,因为在三元运算符的第一个操作数和第二个或第三个操作数的求之间存在序列点.例如,表达式

a = (*p++) ? (*p++) : 0 
Run Code Online (Sandbox Code Playgroud)

有明确的行为.

  • 非常好的答案.现在人们可能想知道如何编写这样的代码或哪些恶性教师提出这样的问题.无用. (2认同)