C ++多值初始化

时间:2013-12-14 13:13:47

标签: c++ variable-assignment assignment-operator

我正在用C ++编写程序。当我为单个变量分配多个值时,我遇到了代码问题。我对特定逻辑感到困惑,因为代码中没有递减运算符,但当i分配多个值时,我的逻辑并不完全理解:

int main()
{
    int j = 1;
    int i = (j+2, j+3, j++);
    cout<<"value is "<<i;
    getch();
    return 0;
}

输出为1。我不知道有人被分配到i

5 个答案:

答案 0 :(得分:2)

当你写int i=(j+2,j+3,j++);时,它基本上就像你写了int i=j++;

这意味着:

1)由于j的值为1,i将具有相同的值;

2)之后该行j将递增。

答案 1 :(得分:1)

正如其他人所指出的那样,你不能做你想做的事情,逗号运算符正在发挥作用。要清楚,这一行:

int i=(j+2,j+3,j++);

正在执行以下步骤:

  
      
  1. j + 2被评估。计算结果为3,由于未分配给任何内容而被丢弃。
  2.   评估
  3. j + 3,参见步骤1.
  4.   
  5. 评估j ++。这会增加j,其值变为2,但计算为j的OLD值,即1。
  6.   
  7. 步骤3的结果分配给i。
  8.   

答案 2 :(得分:0)

变量j是后递增,因此j的当前值被放入i然后j递增。

您可以将此视为:

int j=1;
int temp = j + 2;
int temp1 = j + 3;
int i=j;
j++;

变量temptemp1并不存在且被丢弃。

答案 3 :(得分:0)

阅读:Comma Operator: ,

  

逗号运算符,left-to-right associativity。两个表达   用逗号分隔从左到右进行评估。左操作数是   总是评估,所有副作用都在右边完成   操作数被评估。

表达式:

i = (j + 2, j + 3, j++);

效果相当于(因为j + 2j + 3的评估没有副作用):

i = j++;

因此j的第一个值已分配给i,该值为1,然后j增加到2
此处j + 2j + 3j++之前进行评估,但不起作用。

重要的是要注意表达式中的括号( )优先写入优先级,以便在括号内评估第一个,运算符,然后=进行最终计算。

要了解输出:look at precedence table ,的优先级低于=。在表达式中,您使用括号覆盖优先级。

修改:根据评论:

假设表达式是:

int i = (j++, j+2, j+3);

在此表达式中j++首先增加j的值,因为对++的{​​{1}}操作然后2进行评估,但此子表达式没有副作用最后j + 2评估= j + 35分配给5。最后i的值为i

Check working code

因此,此处5并不等同于int i =(j++, j+2, j+3);,因为i = j + 3具有更改j++值的副作用。

在排序中,如果你有一个像j这样的表达式,那么第一个表达式a = (b, c, d)进行求值,然后表达式b进行求值,然后表达式c进行求值,因为左对齐的关联性为d运算符然后将表达式,的最终值赋给变量d

答案 4 :(得分:0)

让我们考虑这些定义

int j=1;
int i=(j+2,j+3,j++);

(j + 2,j + 3,j ++)是带逗号运算符的表达式。其结果是最后一个子表达式。 Subexpressions j + 2和j + 3既不影响j也不影响i。影响j和i的唯一子表达式是最后一个。这是j ++。 postincrement运算符的值是增量前的原始变量的值。所以j ++的值是1.我会得到这个值。同时j将被压缩并获得价值2.