c ++三元运算符

Rud*_*ddy 8 c++ conditional-operator visual-c++

所以我遇到了一些有趣的东西,我没有意识到三元运算符(至少在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(它分配100到y或z取决于x == 1的真值,如果x == 1为假,则踩z = 99赋值

所以,这引出了我的问题:

A)这部分是实际的c ++标准(看起来会是这样)而不仅仅是微软的东西 - 我看过但是到目前为止却找不到这个信息.

B)如果这被广泛认识并且我一直生活在摇滚之下?我从来没有在任何我能记得的代码中看到过它,并且在讨论三元运算符时从未见过它.

C)我需要更频繁地出去吗?

Jus*_*ini 10

A)是的,这是标准的一部分.

B)它没有被广泛认识,尽管它可能在这里.有一个原因,它被选为C++的第一隐藏功能:C++的隐藏功能?.

C)没有评论.:)

就个人而言,我建议转向使用此功能.它比使用if/ else语句更不直观,显然不是每个人都知道它.

反对我自己的警告,我实际上尝试在个人项目中使用这一次,我因为错过了括号而浪费了30分钟,试图找到错误.