【问题标题】:(Question about i++) What is the principle of this code?(关于i++的问题)这段代码的原理是什么?
【发布时间】:2021-12-02 06:37:08
【问题描述】:

代码

#include <iostream>
using namespace std;

int main()
{
    int i = 1;
    while (i < 10)
        if (i++ % 2 == 0)
            cout << i << endl;

    return 0;
}

输出是

3
5
7
9

由于i为1,我以为if语句满足2% 2 == 0,应该输出2,但不知道为什么是3。

【问题讨论】:

  • 它是后增量,因此它使用 iold 值作为 % 运算符。
  • i++ 在增量之前计算为 i 的值,因此对于 2 是您在 if 的语句中获得的 i == 3 的股息(cout &lt;&lt; i &lt;&lt; endl; 部分)。
  • 让自己熟悉排名第二的程序员生产力工具的好机会:调试器。使用调试器,您可以以您的速度运行程序,并观察计算机对您的程序所做的操作。典型的用法是逐行逐行执行程序,并留意意外情况,例如存储的错误值或采用的错误路径。意外是程序中的错误或您的期望。任何一个都需要修复才能继续。

标签: c++ while-loop post-increment


【解决方案1】:

if (i++ % 2 == 0) 表示评估i%2 并与0 进行比较,并在评估之后的某个时间点增加i之前 cout &lt;&lt; i

这就是为什么您会看到打印的奇数。在每种情况下,偶数 i 会导致执行由 if 控制的语句,并且增量会将偶数更改为奇数。

【讨论】:

  • 哦,哇,我不知道增量值会在新的迭代中持续存在......即使它是一个条件增量?很有趣!
  • 不确定你的意思,@Cataster。 i++++i 无条件地增加 i。区别在于值是在评估之前还是之后增加。
  • 我的意思是条件中发生的增量似乎更新了 if 语句之外的 i 值正确吗?
  • @Cataster 增量发生在您执行它的那一刻。在这种情况下,使用后增量的结果是 old 值,这就是您要与% 比较的值。当您到达cout 时,增量已经发生。这与if 无关
  • @Cataster 我不想尝试用这些术语来确定它。现代编译器在他们所做的事情上非常聪明,他们能够以非常复杂的方式重新排序指令。假设增量发生在评估i 之后和执行coutwhile 语句之前。不过,简单的答案可能会过于简单化,增量是“if 的一部分”
【解决方案2】:

您正在使用 post-increment,它递增变量,然后返回递增前的 old 值。然后,您将打印 incremented 值。

那么,让我们一步一步地看看你的循环:

  • 在第一次迭代中,i 为 1。i++i 设置为 2,但返回 1。所以if 比较1 % 2 == 0,这是错误的。

  • 在第二次迭代中,i 为 2。i++i 设置为 3,但返回 2。所以if 比较2 % 2 == 0,这是真的,所以cout &lt;&lt; i 打印3

  • 在第 3 次迭代中,i 为 3。i++i 设置为 4,但返回 3。所以if 比较3 % 2 == 0,这是错误的。

  • 在第 4 次迭代中,i 为 4。i++i 设置为 5,但返回 4。所以if 比较4 % 2 == 0,这是真的,所以cout &lt;&lt; i 打印5

  • 等等……

听起来您可能希望i++ 改为预增量,返回 值而不是 值。在这种情况下,用于该目的的语法略有不同:

#include <iostream>
using namespace std;

int main()
{
    int i = 1;
    while (i < 10)
        if (++i % 2 == 0) // <-- ++i vs i++
            cout << i << endl;

    return 0;
}

注意++ 相对于i 的位置。两种语法都递增i,但定位++ i 的左侧i 递增后返回 值,而定位++ em>在i 的右侧 返回i 递增之前的 值。

减量运算符-- 也一样。它有 pre-decrementpost-decrement 版本。

【讨论】:

    【解决方案3】:

    根据 C++ 14 标准(5.2.6 递增和递减)

    1 后缀++表达式的值是它的值 操作数。 [注:得到的值是原值的副本 — 尾注] 操作数应为可修改的左值。的类型 操作数应为算术类型或指向完整对象的指针 类型。 操作数对象的值通过加1来修改 它,除非对象是 bool 类型,在这种情况下它被设置为 真的。

    例如,在 while 循环的第二次迭代中,变量 i 在循环的第一次迭代中递增后确实等于 2

    while (i < 10)
        if (i++ % 2 == 0)
            cout << i << endl;
    

    这就是 if 语句的条件

        if (i++ % 2 == 0)
    

    评估为真。但是在条件评估之后变量i 的值增加了。所以这个说法

            cout << i << endl;
    

    输出新值 3。

    你可以通过以下方式等效地重写while循环

    while (i < 10)
        if (i % 2 == 0)
            cout << ++i << endl;
        else
            ++i;
    

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多