我很难理解为什么在C++中的for循环中使用增量运算符与使用"variable"+1有不同的结果。第二种情况下的变量在循环的每次迭代后都不会被记住:
取以下代码:
#include <iostream>
int main(){
int a{0};
for (int i = 0; i < 5; i++){
std::cout << ++a;
}
return 0;
}
它按预期输出:12345
但是,如果我用+1:替换++a
#include <iostream>
int main(){
int a{0};
for (int i = 0; i < 5; i++){
std::cout << a + 1;
}
return 0;
}
我得到:11111
即使我将"a"变量设为静态:
static int a{0};
它仍然输出11111。
为什么"a+1"在每次循环后都不保持其值?如果我想在每次迭代后保持它的值而不使用++(例如,使用另一个像*2这样的操作(,我需要做什么?
为什么"a+1"在每次循环后都不保留其值?
a + 1
是一个不向a
赋值的表达式。即a
不受任何影响。这意味着当您只执行a + 1
时,a
的值仍然是0
(旧值(。
另一方面,++a
具有与相同的效果
v---------->assignment done here implicitly
a = a+1
在上面的表达式++a
中,的值增加1
,使得a
的新值现在是1
。
++a
等价于赋值a= a + 1
(或a+= 1
(。单独的表达式CCD_ 15不修改CCD_。
C++将允许您编写std::cout << (a= a + 1);
。
a++
与a+1
不是一回事,而是与a=a+1
是一回事
有什么区别?
好:a+1
包含值,该值比a
的值高一a=a+1
意味着,除此之外,该值被分配给变量a
,这意味着类似于">将a
替换为其值加1";。
这给出了以下可能性(我还展示了a++
和++a
之间的差异(:
int a=3;
cout<<a+1; // output : 4. Value of 'a' equals 3.
cout<<a+1; // output : 4. Value of 'a' equals 3.
cout<<a+1; // output : 4. Value of 'a' equals 3.
int a=3;
cout<<a++; // output : 3. Value of 'a' becomes 4 after having shown it on screen.
cout<<a++; // output : 4. Value of 'a' becomes 5 after having shown it on screen.
cout<<a++; // output : 5. Value of 'a' becomes 6 after having shown it on screen.
int a=3;
cout<<++a; // output : 4. Value of 'a' becomes 4 before showning it on screen.
cout<<++a; // output : 5. Value of 'a' becomes 5 before showning it on screen.
cout<<++a; // output : 6. Value of 'a' becomes 6 before showning it on screen.
从概念上讲,像+
和*
这样的内置算术运算符评估它们的操作数,用由此获得的值执行相应的运算,并创建一个包含结果的临时对象。
操作数,其中一个是a
,只从中读取,而不是写入。当你考虑到+
是交换性时,这一点就更明显了,也就是说,它的操作数可以在不影响结果的情况下交换:根据定义,a+1
与1+a
相同,显然你不能将任何内容写回立即值1
。
通常,正如您所知,=
在C和C++中用于向变量写入值。C、 通过祖先C++,提供将某些运算的结果写回其操作数之一的快捷方式:它是运算符和赋值=
的组合,例如a += 1
。像所有赋值一样,这是一个表达式(也就是说,它有一个值(,它在运算和赋值后具有变量的值。与所有其他表达式一样,您可以将其用作子表达式,尽管这不是很常见:cout << (a += 1);
会达到所需的效果(括号是必要的,因为赋值的运算符优先级最低(。由于递增(和递减(1是非常常见的,C和C++有一个快捷方式:++a
与a+=1
相同,因此通常会写cout << ++a;
(这是一个避免使用括号的副作用(。