代码之家  ›  专栏  ›  技术社区  ›  Ruddy

c++三元运算符

  •  8
  • Ruddy  · 技术社区  · 16 年前

    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赋给z1

    当然,只有当表达式和条件表达式都是类似于

    (x == 1 ? 0 : z) = 99;

    未能编译,因为0是编译器指出的r值。

    这只在包含括号的情况下有效

    x == 1 ? y : z = 99;

    (x == 1 ? y : z = 99) = 100 do(它根据x==1的真值为y或z赋值100,如果x==1为false,则踩z=99赋值)

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

    A) 这是实际的c++标准的一部分(看起来应该是),而不仅仅是微软的东西——我已经看过了,但到目前为止,还没有找到这个信息。

    B) 如果这一点被广泛认识到,而我一直生活在岩石下?我从来没有见过在我能回忆起的任何代码中使用它,也从来没有见过在讨论三元运算符时提到它。

    C) 我需要经常出去吗?

    3 回复  |  直到 16 年前
        1
  •  10
  •   Community Mohan Dere    9 年前

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

    B) 这一点并没有被广泛认识到,尽管它可能就在这里。有理由认为它是C++的1隐藏特性: Hidden Features of C++? .

    C) 无可奉告。:)

    我个人建议不要使用这个功能。它比使用 if else 声明,显然不是每个人都知道。

    与我自己的警告相反,我在一个个人项目中尝试过一次使用这个方法,但是我被遗漏括号和浪费30分钟来寻找错误弄得焦头烂额。

        2
  •  3
  •   kennytm    16 年前

    答。 对。§[表达式条件]/4:

    在C中为真。在C99标准脚注93中明确写道,“条件表达式不会产生左值。”)

    B。 我不认为它被广泛使用,因为它的用法相当模糊。更常见的是

    if (x == 1)
      y = 99;
    else
      z = 99;
    
        3
  •  2
  •   Daniel Daranas    16 年前

    您从未见过使用它,因为这种用法没有最常见的用法直观和可读性。我也从未见过它在生产代码中以这种方式使用,我希望我从未见过它。

    C++ Coding Standards ,规则6:“正确性、简单性和清晰性是第一位的。”