c - 三元运算符的执行

标签 c macros operator-keyword ternary

#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;
}

我知道答案。它是 11 7 0 但如何呢?请帮助我执行三元运算符。

最佳答案

声明

k==max(i++,++j);  

扩展为

k==(i++)>(j++)?i++:j++;  

注意 == 有更高的 precedence?: 运算符,因此上面的表达式等同于

( k == ((i++)>(j++)) )?i++:j++;  

由于 (i++)>(j++) 将为 true,因此 k == ((i++)>(j++)) 为评估为 false,因此 j++(其值变为 7)将被评估(i++ 将被跳过) .


注意:上面的表达式不会调用未定义的行为,因为存在 sequence point在评估三元运算符的第一个操作数和第二个或第三个操作数之间。例如,表达式

a = (*p++) ? (*p++) : 0 

具有明确定义的行为。

关于c - 三元运算符的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44874453/

相关文章:

c - 这两种说法有何不同?

c -/usr/bin/ld : cannot find shared library

macros - Racket Macro 如何将省略号传递给 Helper 函数?

c++ - UINT_MAX 宏的定义

javascript - 基于更改按钮颜色的比较模态输入值和目标输入值

c - 拆分一个 char[] 并将值存储在不同的数组 C

c - 目标 'all' 的配方在 Ubuntu 15.10 64 位上失败

excel - 编译错误: Argument not optional error when I call macro from other macro

C++ - 使用 GCC 编译时不匹配 'operator='

c++ - 固定表达;运算符优先级