【问题标题】:Increment ++i, i++ and i+=1递增 ++i、i++ 和 i+=1
【发布时间】:2014-02-22 05:10:01
【问题描述】:

我是 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++ 替换为 i+=1 或 ++i,它们都返回 5050 和 i 的总和 101。所以我真的看不出它们有什么区别。

那么谁能给我解释一下?其中哪一个在编程中使用最多?谢谢!!

【问题讨论】:

  • "i++ 先执行,然后递增,++i 先递增,然后执行,i+=1 递增 1,然后执行" - 危险错误。 i++ 是“递增并计算到原始值”;没有说明“首先”会发生什么。
  • @user2357112 确实,除非这些运算符被重载,因为operator++ 必须在表达式被认为已评估之前返回。这就是为什么通常首选预增量/减量 - 无需创建原始对象的副本。

标签: c++ for-loop increment


【解决方案1】:

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

但是这里有:

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 前置和后置运算符应始终单独使用(而不是大型语句的一部分)。它们可能导致混乱的代码,甚至是未定义的行为。

例如,

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

有未定义的行为。

【讨论】:

  • 我认为,如果您拆分 for loop 并向他展示它是如何想象的,这将对 OP 有所帮助。这将奠定坚实的基础。
【解决方案2】:

那么谁能给我解释一下?

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

看看这个,例如:

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

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

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


还有一点需要注意: ++i 是左值,但 i++ 不是。详情见here

【讨论】:

  • 对于第一个问题,您回答“这是 i++ 和 ++i 之间差异的解释”,但您没有提供任何解释。你还好吗,先生?
  • 你只是展示了一些代码,没有解释它或回答任何问题。虽然代码解释对您来说可能很明显,但对阅读它的人来说却不是。
  • 没问题。请记住不要在回答时给予任何理所当然的事情。 ;)
【解决方案3】:

您的分析是正确的。 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 以外的值使用复合赋值运算符。

【讨论】:

    【解决方案4】:

    我想如果你想象一下 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 = i + 1;
    int temp = i; 
    

    temp 不是必需的,因此编译器只会用inc i 指令替换它。

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

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

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

    【讨论】:

    • 你忘了提到 i++ 返回 temp ,如 int temp = i; i = i + 1; return temp;
    猜你喜欢
    • 2022-07-20
    • 2018-06-21
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多