#include
int SQ(int y){
return ((y)*(y));
}
int main(){
int i=1;
while(i<=5){
printf("%d^2 = %d\n", (i-1), SQ(i++));
}
return 0;
}
运行结果:
1^2 = 1
2^2 = 4
3^2 = 9
4^2 = 16
5^2 = 25
问题1:当i=1时,执行“printf("%d^2 = %d\n", (i-1), SQ(i++));”,打印i-1不是先输出0吗?
问题2:sq(i++)函数是怎么运行的
这个程序的结果在不同编译器上可能不同,关键看函数参数求值顺序。
一般来说(但是不是所有编译器都是如此),参数从后往前求值。
当i = 1的时候
printf("%d^2 = %d\n", (i-1), SQ(i++));
相当于
printf("%d^2 = %d\n", 1, SQ(1));
SQ里i就是1,然后i++,然后i-1还是1,作为前一个参数。
不是这样的,先执行的是SQ(i++);
跟你解释一遍吧,首先从i=1开始进入while内循环,然后进入 SQ(i++)此时i的值依然是没有变的,还是1,然后等SQ执行完以后会返回1,并且i才会执行
i++,然后,i的值就变成了2,经过i-1,就会打印第一个%d。而此时就算完成了一次while循环。就会得到1^2 = 1。。后面几次依次类推
关于函数求参数的顺序,参考
http://blog.csdn.net/mimahoo/article/details/51148578
其中第二条 2.函数各参数的求值顺序
还有 https://www.zhihu.com/question/55398409/answer/144394394
我说的
当i = 1的时候
printf("%d^2 = %d\n", (i-1), SQ(i++));
相当于
printf("%d^2 = %d\n", 1, SQ(1));
是指,针对lz所用的编译器得到结果的解释。
不同编译器输出是不同的。
打个断点调试一下就知道了!
printf的执行类似于栈,先入后出,实质上C语言中,参数压栈的方向总是是从右往左。 并不是什么和编译器有关,麻烦楼上不要误导人好不好!printf("%d^2 = %d\n", (i-1), SQ(i++));,楼主请拿出纸和笔,接下来注意两点。1.printf括号里的计算顺序,2.后置加加。那么,先计算SQ(i++),i先不进行自加操作(计算结束后,i进行自加),此时i自加,在计算(i-1)。这就是楼主为什么总是得到这样的答案
这个程序的结果在不同编译器上可能不同,关键看函数参数求值顺序。
一般来说(但是不是所有编译器都是如此),参数从后往前求值。
当i = 1的时候
printf("%d^2 = %d\n", (i-1), SQ(i++));
相当于
printf("%d^2 = %d\n", 1, SQ(1));
SQ里i就是1,然后i++,然后i-1还是1,作为前一个参数
先计算i^2 然后i++ 最后printf
不是这样的,先执行的是SQ(i++);
跟你解释一遍吧,首先从i=1开始进入while内循环,然后进入 SQ(i++)此时i的值依然是没有变的,还是1,然后等SQ执行完以后会返回1,并且i才会执行
i++,然后,i的值就变成了2,经过i-1,就会打印第一个%d。而此时就算完成了一次while循环。就会得到1^2 = 1。。后面几次依次类推