i++
本帖最后由 haiouda 于 2014-9-30 10:41 编辑;#include <stdio.h>
void main()
{
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d\n",p,q,i,j);
}
结果为什么是:15 22 8 8 ?
p=(i++)+(i++)+(i++); i的值为什么一直是5不自增?
q=(++j)+(++j)+(++j); j 的值为什么第一次自增后是6(理解),第二个括号中就变成8了?第三个括号中的值还是8??为什么?
为什么,和分步执行的,结果不一样呢??? 因为按照C语言标准(90或者99)这个程序的输出就是可以有多种答案的,不同的C语言编译器可以有不同的答案。
这题主要目的是要告诉你,你自己千万不要写出类似的程序。
如果考试的时候遇到这种题目,你一定要警醒。。。自己以后当老师教C语言不要再干这种丢脸的事情,会被很多学生嘲笑。 仰望天上的光 发表于 2014-9-30 11:44
因为按照C语言标准(90或者99)这个程序的输出就是可以有多种答案的,不同的C语言编译器可以有不同的答案。 ...
原来被小甲鱼给涮了:sweat: 1,i++是运算以后在自加,p=(i++)+(i++)+(i++),括号里面没有进行运算,所以不会自加,而且+的优先级比++高,所以,p = 5+ 5+5计算完以后,i才进行自加三次。
2,如果分布运算的话,你就把这个程序分解为p =i++;运行三遍,所以分别为5,11,18
3,对于q=(++j)+(++j)+(++j); 不同的编译器运行结果是不同的,对于GCC环境下,相当于q=((++j)+(++j))+(++j);先进行两次累加,一次相加以后,在进行一次累加和一次相加。所以运行结果为22
这个问题需要有一点汇编的思维来理解机器执行的顺序
Answer.zhang 发表于 2014-9-30 17:11
1,i++是运算以后在自加,p=(i++)+(i++)+(i++),括号里面没有进行运算,所以不会自加,而且+的优先级比++高 ...
解释得不对。如果真的需要解释应该从“表达式的值”和“表达式的副作用”这两个方面来说明前置,后置++,和运算符优先级没有太大的关系。 只要指的
i++
和++i的区别就可以了 anyonghui 发表于 2014-10-4 00:56
只要指的
i++
和++i的区别就可以了
小甲鱼不是在汇编中说了是编译器先进行了优化才执行的吗 Answer.zhang 发表于 2014-9-30 17:11
1,i++是运算以后在自加,p=(i++)+(i++)+(i++),括号里面没有进行运算,所以不会自加,而且+的优先级比++高 ...
您讲的很好~第一个式子大概听懂了就是++没进行运算 只是运行了括号 和+
i++这个符号有括号的时候就等于i 因为不能把值赋给y 所以运行不了++是这样吧?
但是的二个式子 基本没看懂 请问什么是GCC环境啊?还有他为什么是 运行两次+1 第三次重复啊?
页:
[1]