c ++三元运算符

时间:2010-07-15 16:00:47

标签: c++ visual-c++ conditional-operator

所以我碰到了一些有趣的东西,我没有意识到三元运算符(至少在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)我是否需要更频繁地离开?

3 个答案:

答案 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:“首先是正确,简洁和清晰。”