int i=10,j=10;
printf("%d %d",++i+j++, j--);
输出结果是 20, 10
执行逻辑是什么?怎么得出来的?
这个printf是用栈实现的,后面的j--先算输出10而j变成9,然后先将i+1再加上j,就是20,然后j再+1变成10
#include<bits/stdc++.h>
using namespace std;
int i,j;
int main(){
i=j=10;
printf("%d %d %d\n",++i+j++,i,j);
i=j=10;
printf("%d %d %d\n",++i+j++,i,j+=2);
i=j=10;
printf("%d ",++i+j++);//分开输出
printf("%d ",i);
printf("%d ",j);
return 0;
}
输出结果:
21 10 10
23 10 12
21 11 11
这样很明显,printf是从后向前执行的
答案应该是 21 11
初始i=10,j=10
++i是先计算+1在运算i,j++是先计算j之后再+1
++i+j++可以看成是(i+1)+j,j+1,即++i+j++此时i=11,j=11,之后输出j--
j--是先输出j再让j-1,由于上一个计算式j++,所以最后的输出结果是21 11
问题解决的话,请点下采纳
结果不确定,函数参数的求值顺序是C语言的未定义行为,语言规范没有规定顺序,不同的编译器不能保证输出的结果一致。你可以试不同的编译器,结果不同
https://blog.csdn.net/chencheng126/article/details/47406597?utm_source=blogxgwz8
我可以再打一个比方,比如我让你们班上的同学都写一个函数 sum(n),计算1+2+...+n的值
你写的是
int sum(int n)
{int s = 0;
for (int i = 1; i <= n; i++) s+= i;
return s;}
你的同学二狗写的是
int sum(int n)
{return (1+n)*n/2;
}
这两个程序在n>=1的时候,运算结果一样。
现在问题来了,当n=-10的时候,你的程序返回10,二狗的程序返回-45。可能铁蛋写的程序返回-1234
大家的就不一样。
为什么,因为老师布置题目的时候,没有规定n<1怎么输出,所以结果是什么取决于你的程序怎么写的。
一个道理,不同的编译器没有考虑这种代码应该输出什么,所以结果五花八门了。
i++,和++i的执行顺序不一样,前者是先输出后加,后者是先加后输出
++i应该是11+J++是加上J原本的值10我感觉第一个应该是21
第二个j--也是输出j原本的值10然后在输出
我感觉答案应该是 21 10
我用VC++6.0输出的是 21 10 ,按照逻辑看应该也是21和10
C语言每个IDE的库函数不一样,而问题就在于这,一个BUG:自增自减,每个IDE得出的答案都不怎么一样。
原因是这种自增自减运算在函数运行时会发生混乱,这题答案我认为要么是21、10,要么是无解,因为IDE目前还无法解决这个问题。
这也揭示了一个道理:写代码最好别用这个。分行写,就会解决。
好讲解就到这里,记得_采纳_哟!