Increment ++i, i++ and i+=1

Increment ++i, i++ and i+=1

本文关键字:and i++ ++i Increment      更新时间:2023-10-16

我是C++的初学者。我的理解是:-

i++是先执行,然后递增,++i是先递增,然后执行,i+=1是递增1,然后执行。但在FOR循环中:

for (i=0;i<10;i++)
for (i=0;i<10;++i)

上面这两个循环实际上没有什么区别。

这里是另一个计算从1到100的所有整数之和的方法:

int i=1, sum=0;
while (i<=100)
{
sum+=i;
i++;         //i+=1;    ++i;
}
cout<<sum<<" "<<i<<endl;
return 0;

但如果我用I+=1或++I替换I++,它们都返回5050和101的和。所以我真的看不出他们有什么不同。

有人能向我解释一下吗?其中哪一个在编程中使用最多?非常感谢。

你是对的。在你的例子中没有区别。

但这里有:

int i = 0;
cout << i++ << endl;  //prints 0
cout << i   << endl;  //prints 1

int i = 0;
cout << ++i << endl;  //prints 1
cout <<   i << endl;  //prints 1

其中哪一个在编程中使用最多?

大多数时候,++是语句中唯一的操作(仅供参考,for循环有三个语句)。

如果不是,那么它可能很重要,你会使用任何一个给你正确行为的。

仅供参考

一些开发人员认为if pre和postfix运算符应该始终单独使用(而不是大型语句的一部分)。它们可能导致代码混乱,甚至导致未定义的行为。

例如,

int i = 0;
cout << i++ + i++ << endl;

具有未定义的行为。

有人能向我解释一下吗?

i++所做的是返回i的当前值,然后将其递增一,++i首先将i递增1,然后返回i的值。

看看这个,例如:

i = 5;
j = 5;
res = i++;    //res = 5, but i=6
res = ++j;    //res = 6 and j=6

其中哪一个在编程中使用最多?

两者的使用取决于您想要什么或可能是您想要的方式。


还有一件事需要注意:++i是一个l值,但i++不是。有关详细信息,请参阅此处

您的分析是正确的。i++将返回i的值,然后递增,而++i将递增i的值,随后返回新值。CCD_ 15将执行与CCD_ 16相同的操作。它们在实际代码中的使用位置的差异主要是情境性的;对于它们中的每一个在哪里最常用或最有用,没有具体的答案。这完全取决于你想做什么。

这里有一个人为的例子,说明使用后增量(i++形式)可能有用:

// Return the length of a string, including the null byte
int stringLength(char str[])
{
int length = 0;
while (str[length++] != 0);
return length;
}

如果您想返回不包含空字节的长度,可以使用++i形式稍微修改上面的示例:

// Return the length of a string, without the null byte
int stringLength(char str[])
{
int length = -1;
while (str[++length] != 0);
return length;
}

至于i += 1,我想我从来没有这么做过,因为你可以使用前增量或后增量。我通常只对1以外的值使用复合赋值运算符。

我认为,如果你想象一下for循环是如何工作的,你就能理解眼前的问题。

用于环路

initialization    --> i = 0
<check condition>  --> i<10? ------->--------------------
|                      |                                |
^                      |yes(i.e condition not met)      |no(i.e condition met)
|                      V                                V
|                  --------------
|                  |body of loop|
|                  --------------
|                      |
|                      V
-------<------------increment i (**)                exit for loop

**increment i表示i++++i

i++可以替换为:

int temp = i;
i = i + 1;

temp在这里是无用的,所以编译器会将其优化为仅inc i指令。即使它不起作用,CCD_ 26也只是浪费空间,仅此而已。

++我可以被取代

i = i + 1;
int temp = i; 

同样,不需要temp,所以编译器将用inc i指令替换它。

如果您看到两个指令是相同的,因为它们是而不是被分配给任何东西。只有CCD_ 28受到增量的影响。所以两者本质上是相同的。如果CCD_ 29是内置类型,则这是真的。

你看到增量指令放在循环的后面了吗?你现在能看到这几乎和你展示的while循环相似吗?

以这种方式思考循环总是很好的。