所以我遇到了一些有趣的东西,我没有意识到三元运算符(至少在Visual C++ 98-2010中).正如在http://msdn.microsoft.com/en-us/library/e4213hs1(VS.71).aspx中指出的那样,如果表达式和条件表达式都是l值,则结果是l值.
当然通常在c/c ++中你会写一些类似的东西:
int value = (x == 1) ? 1 : 0;
甚至从不关心r值/ l值的影响,在这种情况下,1和0都不能转换为l值.
但是,请采取以下措施:
int value = (x == 1) ? y : z;
y和z都是l值,它们,或者更准确地说,其中一个是三元运算符的实际结果(不是它的存储值),这不一定是显而易见的(至少我从来没有考虑过任何长度) ).
但是,这导致了编写以下内容的能力
(x == 1 ? y : z) = 99;
如果x = = 1,则将99分配给y,如果x!= 1,则将99分配给z
我从未见过在任何地方和我所读过的关于使用(或通常是否使用)三元运算符的所有讨论中所描述的内容.
当然,只有表达式和条件表达式都是l值时,它才有效
(x == 1 ? 0 : z) = 99;
无法编译,因为0是编译器愉快地指出的r值.
这只适用于包括括号的情况
x == 1 ? y : z = 99;
是完全不同的东西,只有当(x!= 1)并且美丽的部分是双方仍然是l值时才分配99到z所以有类似的东西(x == 1 ? y : z = 99) …