【问题标题】:Strange multiple assignment error in C++C ++中奇怪的多重赋值错误
【发布时间】:2012-08-10 14:59:19
【问题描述】:

我的程序中有多个赋值语句,如下所示,query.constraints.size() 应该返回 13constraints 是一个数组,它返回它的大小)

int num,size =  query.constraints.size();

当我这样做时,size 按预期变为 13,但 num 由于某种原因变为 9790272。

当我按照下面的方式单独执行它们时,一切都很好,并且它们都像预期的那样是 13 岁

int size =  query.constraints.size();

int num =  query.constraints.size();

为什么我的多重赋值会导致奇怪的值?

【问题讨论】:

  • 你根本没有任何赋值语句。

标签: c++ variable-assignment


【解决方案1】:

为什么我的多重赋值会导致奇怪的值?

因为 C++ 没有多重赋值1。您在这里声明了两个变量,但只初始化第二个,而不是第一个。


1 好吧,你可以使用int a, b = a = c;,但是大多数 C++ 程序员会认为这样做的代码很糟糕,除非在非常特殊的情况下。

【讨论】:

    【解决方案2】:

    您不是多次分配,而是多次声明。您需要执行以下操作:

    int num, size;
    size = num = query.constraints.size();
    

    【讨论】:

      【解决方案3】:

      一个多重赋值看起来像:

      int num, size;
      num = size = query.constraints.size();
      

      但逗号运算符不做多重赋值。

      【讨论】:

        【解决方案4】:

        你所拥有的实际上是一个声明语句,部分带有初始化器。您的代码等同于以下代码:

        int num;  // uninitialized, you're not allowed to read it
        
        int size(query.constraints.size());  // initialized
        

        一般来说,T x = expr;声明一个T类型的变量x,然后复制初始化它的值为expr。对于基本类型,这正是您所期望的。对于类类型,复制构造函数只是形式上需要,但实际上通常省略。

        【讨论】:

          【解决方案5】:

          逗号操作符没有做你认为它做的事情

          【讨论】:

          • 它只是列表中的分隔符。就像printf("Hello %s", world) 中没有逗号运算符一样。
          • @Gir 逗号运算符可以重载。他语句中的逗号不是逗号操作符,而是语法的一部分,这里重载逗号操作符是没有作用的。
          • 因为是变量声明的一部分?
          猜你喜欢
          • 1970-01-01
          • 2014-09-03
          • 2012-12-15
          • 2017-11-07
          • 2019-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-08
          相关资源
          最近更新 更多