2012-04-05 57 views
5

考虑下面的代码段:有效使用条件运算符?

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); 

在该傻示例,条件运算表达式为快捷方式:

if (i & 1) k = 99 - i; else m = 99 - i; 

我的编译器不会抱怨并执行该代码段给出了预期输出

k: 98 m: 99 

我的问题,虽然是如果这是根据C标准的有效代码?我从来没有见过像之前使用过的任何东西。

+0

如果编译和执行不如预期,那么它最有可能有效。然而,你应该问自己,如果你想维护这样的代码,特别是如果它几年没有被触及,并且你必须弄清楚你回来5年后的行为。 – 2012-04-05 15:23:20

回答

8

脚注110在C11标准:

条件表达式不产生左值。

而且6.5.16条第2款:

赋值操作员有修改的左值作为其左操作数。

所以,不,代码不符合C标准。

在C++ 11,它是有效

如果第二和第三运算数是左值和具有相同的类型,则结果是该类型的,并且是左值。

所以这是C和C++显着不同的那些尘土飞扬的角落中的另一个。如果您的编译器不会产生错误,那么我猜测您正在使用具有“C模式”的C++编译器,而不是正确的C编译器; MSVC?

+1

但我认为它是有效的C++。 – hugomg 2012-04-05 15:32:11

+0

我正在编译它为C++代码,是的,不是在MSVC++ 6.0的“C模式”下。我没有尝试在C模式下编译它。即使它是有效的,无论是C语言还是C++语言,我都不打算使用它;当我想到如何编写我想要的程序时,我想到了这一点,我对它的有效性感到好奇。感谢您的回复! – zarulad 2012-04-05 21:01:32

+0

@zarulad:高兴地帮忙! – 2012-04-05 21:33:11

1

它是有效的使用条件如C中的lval中++,但不是在C.

在C++(ISO IEC 14882:1998(E)5.16.4)

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

如果你想在C使用类似的技巧,你应该使用指针:

ISO/IEC 9899:TC2,6.5.14.6

如果第二和第三个操作数是指针或一个是空指针常量,另一个是指针,结果类型是指向一个类型的指针,该类型限定了两个操作数指向的类型的所有类型限定符。

*((i & 1) ? &k : &m) = 99 - i; 
+0

那么@StephenCanon的报价呢? – 2012-04-05 15:30:54

+0

@PavanManjunath我再次混淆了C和C++。我更新了我的答案以反映这一点。谢谢! – dasblinkenlight 2012-04-05 15:40:49

4

这是不合法的C,并接受它是错误的编译器。但是,你可以做同样的事情:

*((i & 1) ? &k : &m) = 99 - i; 

,并成为法律C.