printf(“%d%d \ n”,i ++,i ++)输出

时间:2014-01-19 18:03:00

标签: c++ c

为什么此代码将输出显示为“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” 为什么以相反的顺序打印

2 个答案:

答案 0 :(得分:4)

在此声明中,表达式   “printf(...)”不止一次修改变量“i”   没有插入序列点。

  

这种行为     未定义。

编译器检测到了一个案例   同一个变量已被多次修改过   一个没有序列点的表达式   修改。因为会发生什么修改   最后没有定义,这个表达式可能产生   不同平台上的结果不同。

  

重写表达式以便每个表达式     变量只被修改一次。

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

答案 1 :(得分:0)

printf的评价顺序在这里是从右到左

首先评估

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

然后

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

所以你得到了3 2

的输出

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

  

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