为什么此代码将输出显示为“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” 为什么以相反的顺序打印
答案 0 :(得分:4)
在此声明中,表达式 “printf(...)”不止一次修改变量“i” 没有插入序列点。
这种行为 未定义。
编译器检测到了一个案例 同一个变量已被多次修改过 一个没有序列点的表达式 修改。因为会发生什么修改 最后没有定义,这个表达式可能产生 不同平台上的结果不同。
重写表达式以便每个表达式 变量只被修改一次。
即使您可能在不同的编译器中输出“2 3”
答案 1 :(得分:0)
printf
的评价顺序在这里是从右到左
首先评估
printf("%d %d\n",i++,i++);
^
然后
printf("%d %d\n",i++,i++);
^
所以你得到了3 2
由于参数的未定义评估顺序,行为肯定是未定义的。
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,先前的值应该是只读的,以确定要存储的值。