所以我碰到了一些有趣的东西,我没有意识到三元运算符(至少在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) = 100
这样的严重漏洞do(它根据x == 1的真值分配100到y或z,如果x == 1为假,则踩z = 99赋值)
所以,这引出了我的问题:
A)这是实际c ++标准的一部分(看起来会是这样)而不仅仅是微软的东西 - 我看过但是到目前为止却找不到这个信息。
B)如果这被广泛认识并且我一直生活在摇滚之下?我从来没有在任何我能记得的代码中看到过它,并且在讨论三元运算符时从未见过它。
C)我是否需要更频繁地离开?
答案 0 :(得分:10)
A)是的,这是标准的一部分。
B)它没有被广泛认识,尽管它可能在这里。有一个原因,它被选为C ++的第一隐藏功能:Hidden Features of C++?。
C)没有评论。 :)
就个人而言,我建议不要使用此功能。它比使用if
/ else
语句更不直观,显然不是每个人都知道它。
反对我自己的警告,我实际上尝试过在个人项目上使用过一次,因为错过了括号而浪费了30分钟试图找到错误而烧毁了。
答案 1 :(得分:3)
A。是的。 §[expr.cond] / 4:
如果第二个和第三个操作数是左值并且具有相同的类型,则结果是该类型并且是左值...
(请注意,在C语言中不为真。在C99标准中明确写出,脚注93,“条件表达式不会产生左值。”)
B。我不认为它被广泛使用,因为用法非常模糊。更常见的是看
if (x == 1)
y = 99;
else
z = 99;
答案 2 :(得分:2)
您从未见过它,因为这种用法不像最常见的那样直观和可读。我也从未在生产代码中看到过这种方式,我希望我从未见过它。
记住Herb Sutter& Andrei Alexandrescu的C++ Coding Standards,规则6:“首先是正确,简洁和清晰。”