繁体   English   中英

增量++ i,i ++和i + = 1

[英]Increment ++i, i++ and i+=1

我是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

VS

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

编程中哪一个最常用?

大多数情况下, ++是语句中唯一的操作(FYI, for循环有三个语句)。

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

FYI

一些开发人员认为,如果pre和postfix运算符应该总是单独使用(不是大语句的一部分)。 它们可能导致令人困惑的代码,甚至是未定义的行为。

例如,

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

有未定义的行为。

那么有人可以向我解释这个吗?

什么i++的作用是返回的当前值i ,然后由一个增加它,并++i第一次增加i1 ,然后返回的值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 ,然后返回新值。 i += 1将与++i相同。 它们在实际代码中的使用位置差异主要是情境; 关于每个人最常使用或有帮助的地方,没有具体的答案。 这一切都取决于你想做什么。

这是一个人为的例子,一次使用后增量( 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循环如何工作,您可以理解手头的问题。

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指令。 即使它没有那么temp也只是浪费空间而已。

++我可以被替换

i = i + 1;
int temp = i; 

再次temp不是必需的,所以编译器只需用inc i指令替换它。

如果你看到两条指令都是相同的,因为它们没有被分配给任何东西。 只有i受到增量的影响。 所以两者基本相同。 如果i是内置类型,这是真的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM