【问题标题】:printf("%d %d\n",i++,i++) output [duplicate]printf("%d %d\n",i++,i++) 输出 [重复]
【发布时间】:2014-01-19 18:03:00
【问题描述】:

为什么这段代码将输出显示为“3 2”而不是“2 3”?

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
#include<vector>
using namespace std;
int main()
{

    int i=2;// declare

    printf("%d %d\n",i++,i++);//print
    return 0;
}

输出为:“3 2” 为什么它以相反的顺序打印

【问题讨论】:

标签: c++ c


【解决方案1】:

在这个语句中,表达式 "printf(...)" 多次修改变量 "i" 没有中间序列点。

这种行为 未定义。

编译器检测到一种情况 同一个变量在 之间没有序列点的表达式 修改。因为会发生什么修改 last 没有定义,这个表达式可能会产生 不同平台上的结果不同。

重写表达式,使每个 变量只修改一次。

即使你可能在不同的编译器中得到输出“2 3”

【讨论】:

    【解决方案2】:

    这里printf的求值顺序是从右到左

    先评估

    printf("%d %d\n",i++,i++);
               ^
    

    然后

    printf("%d %d\n",i++,i++);
             ^
    

    所以你得到了3 2的输出

    由于参数的未定义评估顺序,行为肯定是未定义的。

    在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。此外,应仅读取先验值以确定要存储的值。

    【讨论】:

      猜你喜欢
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多