【问题标题】:Variable initialization in C++: a unique methodC++中的变量初始化:一种独特的方法
【发布时间】:2013-03-16 07:54:05
【问题描述】:

最近我遇到了这段代码。我不知道为什么在我的“编码生活”中从未见过这种语法。

int main()
{
    int b;
    int a = (b=5, b + 5);

    std::cout << a << std::endl;
}

a 的值为 10。这种初始化方式到底叫什么?它是如何工作的?

【问题讨论】:

    标签: c++ initialization


    【解决方案1】:

    此声明:

    int a = (b=5, b + 5);
    

    使用comma operator。根据 C++11 标准的第 5.18/1 段:

    [...] 一对用逗号分隔的表达式从左到右计算;左边的表达式是一个丢弃的值 表达式(第 5 条).83 与左表达式相关的每个值计算和副作用 在与正确表达式相关的每个值计算和副作用之前排序。 类型 结果的和值是右操作数的类型和值;结果是相同的值类别 作为它的右操作数,并且如果它的右操作数是一个左值和一个位域,则它是一个位域。如果正确的值 操作数是临时的(12.2),结果是临时的。

    因此,您的语句相当于:

    b = 5;
    int a = b + 5;
    

    就个人而言,我看不出这里使用逗号运算符的原因。只需以易于阅读的方式初始化您的变量,除非您有充分的理由不这样做。

    【讨论】:

    • +1 最后一段,这只是恕我直言的混淆,应尽可能避免(几乎总是)。在我与同事一起维护的少数 mloc 中,我认为没有一个地方使用逗号运算符,而且我会无耻地对任何敢于这样做的人造成身体伤害。可读性是第一位的。
    • @FoY:哦,我明白了。无论如何,您不会在现实世界的应用程序中找到很多此类代码。如果您这样做,请考虑将其更改(或建议更改)为更具可读性的内容;)
    【解决方案2】:

    operator , 依次计算参数并返回最后一个值

    它不仅可以用于初始化

    【讨论】:

      【解决方案3】:

      逗号, 运算符允许您分隔表达式。由

      exp1, exp2, ..., expn 
      

      计算为expn

      那么会发生什么,首先将b 设置为5,然后将a 设置为b + 5

      附注:由于, 在运算符表中的优先级最低,因此

      int a = b = 5, b+5;
      

      不同于

      int a = (b = 5, b+5);
      

      因为第一个被解析为(int a = b = 5), b + 5

      【讨论】:

        【解决方案4】:

        在表达式中使用时,逗号运算符将计算其所有操作数(从左到右)并返回最后一个。

        【讨论】:

          【解决方案5】:

          初始化称为复制初始化。如果忽略右边的复杂表达式,则与中相同:

          int a = 10;
          

          这与直接初始化形成对比,看起来像这样:

          int a(10);
          

          (您可能分别对如何评估逗号表达式感到困惑。请指出是否是这种情况。)

          【讨论】:

          • 我的意思是复杂的表达方式 :) 但一切都很好,已经回答了。
          猜你喜欢
          • 2011-09-24
          • 2017-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-02
          • 1970-01-01
          • 2012-01-23
          • 1970-01-01
          相关资源
          最近更新 更多