【问题标题】:Can someone explain this C/C++ syntax?有人可以解释这个 C/C++ 语法吗?
【发布时间】:2011-01-07 07:49:24
【问题描述】:

有人能解释一下这是如何工作的吗?

int x, y;
....
(some_condition ? x : y) = 100;

这是打算工作还是只是“盲目”翻译或编译器(类似于vec[10] 等于10[vec])?

【问题讨论】:

    标签: c++ c programming-languages syntax


    【解决方案1】:

    这是有效的 C++ 和无效的 C。

    条件表达式的结果可以是(在这种情况下是)C++ 中的 左值,它引用 xy 之一,具体取决于 some_condition 的计算结果是否为 @987654324 @。在 C++ 中,如果 some_condition 在转换为 bool 时为 true,则为 x 分配值 100,否则为 y 分配值 100。

    在 C 中,条件表达式的结果绝不是 左值,不能赋值。

    【讨论】:

    • 我也在 C 中尝试过。有用。 (我使用了 CodeBlocks/Mingw,但我认为它也适用于其他编译器)
    • 所以我知道如果遵守规范,这应该只在 C++ 中有效?
    • 我在哪里可以找到一个“纯血统”的 C 编译器来测试这个? (我假设 C++ 编译器在编译 C 代码时没有问题,所以从上面可能是这里?)
    • 在一个简单的例子中可以绕过 C 规则:*(some_condition ? &x : &y) = 100;
    • gcc 符合,使用-std=c99 开关。
    【解决方案2】:

    至少在 C++ 中,该代码 sn-p 本质上等同于:

    if(some_condition)
    {
        x = 100;
    }
    else
    {
        y = 100;
    }
    

    这是由 C++ 标准保证的,尽管您必须仔细阅读相关部分。运算符的规则出奇的复杂(主要是由于执行了类型转换),所以条件运算符和 if-then-else 语句并不总是完全等价的。

    但是,在您上面的代码 sn-p 中,标准中的这一段是相关的:

    5.16/4 条件运算符:

    如果第二个和第三个操作数是左值并且具有相同的类型,则结果是该类型并且是左值。

    【讨论】:

    • 在我们的水平上是的,但是,从编译器的角度来看,我不确定。 x 和 y 之间至少存在一个强类型约束,而 if elseconstruct 不存在。
    【解决方案3】:

    这是一个与这段代码结果相同的表达式:

    if (some_condition)
      x = 100;
    else
      y = 100;
    

    【讨论】:

      【解决方案4】:

      如果 x 和 y 是左值,则三元表达式是左值。

      讨论here

      【讨论】:

      • 仅在 C++ 中。 (而且只有它们的类型匹配?)
      【解决方案5】:

      不,它是 if 条件的简写形式。就像

      if(somecondition)
      {
        x = 100;
      }
      else
      {
        y = 100;
      }
      

      【讨论】:

        【解决方案6】:

        x 和 y 都是相同类型的左值。 我不认为这段代码有什么盲点。 但是你可能会发现一些编译器无法编译这段代码。

        我通常更喜欢使用 if/else 代码,它产生完全相同的代码并且对维护者来说更具可读性。 如果您想跟踪错误,将每个分支放在单独的分支上更容易设置断点。

        代码覆盖控制也更容易检查。

        【讨论】:

          【解决方案7】:

          您根据条件分配给xy

          【讨论】:

            【解决方案8】:

            它看起来像一个选择左值的三元运算符。我不知道这可以做到,但我认为这很有意义。根据条件,两个值(x 或 y)之一将被分配数字 100。

            如果它有效,那就太酷了!

            【讨论】:

            • 我真的不确定它是否适用于每个现有的 c++ 编译器!而且三元运算符有点混淆,这种模式给维护者增加了一点乐趣。
            • @VGE:是的,这有点令人困惑。可能小到可以容忍(或享受?)。
            【解决方案9】:

            它旨在工作。

            三元运算符 ?: 如果两个可能的结果都是左值,则可以产生一个左值(即您可以分配的东西),就像在您的示例中一样。

            因此,您的示例根据其他值为 x 或 y 分配一个值。

            【讨论】:

              【解决方案10】:

              将 x 或 y 的值替换为 100 取决于条件。返回的时候也一般使用-

              return condition ? x : y ; // If condition is true => return x else return y 
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-03-17
                • 1970-01-01
                • 2021-10-15
                • 2021-04-28
                • 2018-03-03
                相关资源
                最近更新 更多