有效使用条件运算符?

zar*_*lad 5 c conditional-operator

考虑以下代码:

int i, k, m;
k = 12;
m = 34;
for (i = 0; i < 2; i++) ((i & 1) ? k : m) = 99 - i;
printf("k: %ld   m: %ld\n\n", k, m);
Run Code Online (Sandbox Code Playgroud)

在这个愚蠢的例子中,条件运算符表达式是一个快捷方式:

if (i & 1) k = 99 - i; else m = 99 - i;
Run Code Online (Sandbox Code Playgroud)

我的编译器没有抱怨并执行这段代码给出了预期的输出

k: 98   m: 99
Run Code Online (Sandbox Code Playgroud)

不过,我的问题是,如果这是符合C标准的有效代码吗?我以前从未见过这样的东西.

Ste*_*non 8

C11标准中的脚注110:

条件表达式不会产生左值.

和6.5.16第2段:

赋值运算符应具有可修改的左值作为其左操作数.

所以不,该代码不符合C标准.

在C++ 11中,它有效的:

如果第二个和第三个操作数是左值并且具有相同的类型,则结果是该类型并且是左值.

所以这是另一个尘封的角落,C和C++显着不同.如果您的编译器没有产生错误,那么我猜你正在使用带有"C模式"的C++编译器,而不是正确的C编译器; MSVC?