C++;多值初始化 我正在用C++编写一个程序。当我将多个值赋给单个变量时,代码有问题。我对特定的逻辑感到困惑,因为代码中没有减量运算符,但当I分配多个值时,我并不完全理解其逻辑: int main() { int j = 1; int i = (j+2, j+3, j++); cout<<"value is "<<i; getch(); return 0; } intmain() { int j=1; inti=(j+2,j+3,j++); cout

C++;多值初始化 我正在用C++编写一个程序。当我将多个值赋给单个变量时,代码有问题。我对特定的逻辑感到困惑,因为代码中没有减量运算符,但当I分配多个值时,我并不完全理解其逻辑: int main() { int j = 1; int i = (j+2, j+3, j++); cout<<"value is "<<i; getch(); return 0; } intmain() { int j=1; inti=(j+2,j+3,j++); cout,c++,variable-assignment,assignment-operator,C++,Variable Assignment,Assignment Operator,变量j是后增量,因此j的当前值被放入i中,然后j被递增 您可以将其视为: int j=1; int temp = j + 2; int temp1 = j + 3; int i=j; j++; 变量temp和temp1实际上不存在并被丢弃。阅读: 逗号运算符,具有从左到右的关联性 由逗号分隔的值从左到右求值。左操作数为 始终进行评估,所有副作用都会在右前完成 计算操作数 表达方式: i = (j + 2, j + 3, j++); 效果相当于(因为对j+2和j+3的评估没有副作用): 因此j

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

您可以将其视为:

int j=1;
int temp = j + 2;
int temp1 = j + 3;
int i=j;
j++;
变量
temp
temp1
实际上不存在并被丢弃。

阅读:

逗号运算符
具有
从左到右的关联性
由逗号分隔的值从左到右求值。左操作数为
始终进行评估,所有副作用都会在右前完成
计算操作数

表达方式:

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

因此
j
的第一个值被分配给
i
,即1,然后
j
增加到
2

这里在
j++
之前对
j+2
j+3
进行了评估,但没有效果

重要的是要注意表达式中的括号
()
优先于写入优先级,因此首先
运算符在括号内求值,然后
=
最后求值

要理解输出:
的优先级低于
=
。在表达式中,您必须使用括号覆盖优先级

编辑:根据评论:

假设表达式为:

int i = (j++, j+2, j+3);
在这个表达式中,
j++
首先增加
j
的值,因为
++
操作到
2
,然后
j+2
求值,但是这个子表达式没有副作用,最后
j+3
求值=
5
,并且
5
被分配到
i
。因此,在e端为
5

所以这里的
inti=(j++,j+2,j+3);
并不等同于
i=j+3
,因为
j++
具有改变
j
值的副作用


如果你有一个像
a=(b,c,d)这样的表达式,那么在排序中
然后第一个表达式
b
求值,然后表达式
c
求值,然后表达式
d
求值,因为
的左写关联性,
运算符然后表达式
d
的最终值在写入
int i=(j+2,j+3,j++)时分配给变量
a
,基本上就像你写的
inti=j++;

这意味着:

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


2)之后,代码< > > <代码>将增加。

让我们考虑这些定义

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

(j+2,j+3,j++)是一个带有逗号运算符的表达式。其结果是最后一个子表达式。子表达式j+2和j+3既不影响j也不影响i。唯一影响j和i的子表达式是最后一个子表达式。它是j++。增量后运算符的值是增量前原始变量的值。因此,j++的值是1。我将l得到这个值。同时j将递增,得到值2。

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

int i=(j+2,j+3,j++);
正在执行以下步骤:

  • 计算j+2。计算结果为3,由于未分配给任何对象,因此被丢弃
  • 评估j+3,参见步骤1
  • 计算j++的值。这将增加j,其值变为2,但计算结果为旧值j,即1
  • 步骤3的结果分配给i

  • 这不是将多个值赋给一个变量,这是不可能的。您需要阅读有关的。Joachim的注释说明了一切。int i=(j++,j+2,j+3)但是当我们处理这个问题时,为什么我们的问题的答案变成了5。因为根据具体情况,答案应该是4logic@user3102208这相当于
    i=j+3
    我已经读过了,但正如j=1和你所说的i=j+3;因此,根据这一点,我应该是4。但事实并非如此,而是5。@user3102208根据你的eexpression
    inti=(j++,j+2,j+3);
    (在第一个注释中)如果
    j=1
    首先
    j++
    增加到
    2
    ,那么由于
    i=j+3
    ,则
    i
    将被删除5@user3102208读一下答案中的最后一句话,我想这会对你们有所帮助。inti=(j++,j+2,j+3)我明白你的意思,但为什么在这种情况下答案会变成5而不是4。因为j=1;然后是j++;然后是i=j+3;所以j=1,然后是j=2,然后是i=2+3;
    int i=(j+2,j+3,j++);