我正在用C ++编写程序。当我为单个变量分配多个值时,我遇到了代码问题。我对特定逻辑感到困惑,因为代码中没有递减运算符,但当i
分配多个值时,我的逻辑并不完全理解:
int main()
{
int j = 1;
int i = (j+2, j+3, j++);
cout<<"value is "<<i;
getch();
return 0;
}
输出为1
。我不知道有人被分配到i
。
答案 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++);
正在执行以下步骤:
- j + 2被评估。计算结果为3,由于未分配给任何内容而被丢弃。
评估- j + 3,参见步骤1.
- 评估j ++。这会增加j,其值变为2,但计算为j的OLD值,即1。
- 步骤3的结果分配给i。
醇>
答案 2 :(得分:0)
变量j是后递增,因此j的当前值被放入i然后j递增。
您可以将此视为:
int j=1;
int temp = j + 2;
int temp1 = j + 3;
int i=j;
j++;
变量temp
和temp1
并不存在且被丢弃。
答案 3 :(得分:0)
逗号运算符
,
有left-to-right associativity
。两个表达 用逗号分隔从左到右进行评估。左操作数是 总是评估,所有副作用都在右边完成 操作数被评估。
表达式:
i = (j + 2, j + 3, j++);
效果相当于(因为j + 2
和j + 3
的评估没有副作用):
i = j++;
因此j
的第一个值已分配给i
,该值为1,然后j
增加到2
。
此处j + 2
和j + 3
在j++
之前进行评估,但不起作用。
重要的是要注意表达式中的括号( )
优先写入优先级,以便在括号内评估第一个,
运算符,然后=
进行最终计算。
要了解输出:look at precedence table ,
的优先级低于=
。在表达式中,您使用括号覆盖优先级。
修改:根据评论:
假设表达式是:
int i = (j++, j+2, j+3);
在此表达式中j++
首先增加j
的值,因为对++
的{{1}}操作然后2
进行评估,但此子表达式没有副作用最后j + 2
评估= j + 3
,5
分配给5
。最后i
的值为i
。
因此,此处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.