注册 登录
编程论坛 C语言论坛

新手刚刚来 求答案过程 大佬们

小白加大黑 发布于 2019-03-16 21:42, 2463 次点击
#include <stdio.h>

int main() {
    int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",p,q,i,j);
}
15 回复
#2
吹水佬2019-03-17 04:40
是自己想出来的还是从哪抄来的
#3
wp2319572019-03-17 09:15
没有标准答案  没有研究价值
#4
浅草没马蹄2019-03-17 10:10
运算p的那一句可以等价为:
p=i+i+i;
i=i+1;
i=i+1;
i=i+1;
运算q的则是:
j=j+1;
q=j;
j=j+1;
q=q+j;
j=j+1;
q=q+j;
简单地说,就是++在前,先自加,再参与运算;++在后,先运算,再参与自加
#5
pseudo2019-03-17 20:06
运算规则四楼说了,要么看书。自己慢慢算吧。
#6
rjsp2019-03-17 20:34
既然是初学者,那我劝你听2楼“吹水佬”的,
C标准规定在两个“序列点”之间,同一变量不能有多次“副作用”,否则属于“未定义行为”。
所以一切解释为什么输出什么值的人,都是在瞎扯。
(但假如你学的是谭浩强C,那没办法,他怎么胡扯,你就得怎么听)

参见: https://zh.
#7
小白加大黑2019-03-17 22:39
回复 6楼 rjsp
这个是网上看到的,我就是想知道p=(i++)+(i++)+(i++)这里面的第一个i是5,然后会赋予第二个i的值是6,第三个i的值是7
然后p=5+6+7,最后输出i的值是8.大佬这样对吗??
#8
小白加大黑2019-03-17 22:41
回复 4楼 浅草没马蹄
恩恩  
#9
小白加大黑2019-03-17 22:48
回复 5楼 pseudo
谢谢,我会努力的
#10
wp2319572019-03-18 08:04
以下是引用小白加大黑在2019-3-17 22:39:37的发言:

这个是网上看到的,我就是想知道p=(i++)+(i++)+(i++)这里面的第一个i是5,然后会赋予第二个i的值是6,第三个i的值是7
然后p=5+6+7,最后输出i的值是8.大佬这样对吗??



都说了  没有研究价值,有那功夫 不如喝杯茶
#11
forever742019-03-18 15:34
所谓未定义行为,你可以认为怎么理解都是对的。
既然是这样,执着于怎样才是对的就没有什么意义。
从这个意义上看,这个问题就和讨论您的第15个孩子的性别的现实意义差不多。
#12
zzz2019-03-18 16:27
毫无意义,换成数学的 + - * /看
#13
小白加大黑2019-03-18 23:51
回复 10楼 wp231957
大佬,能不能推荐本编程的书,适合新手的  嘻嘻
#14
小白加大黑2019-03-18 23:52
回复 11楼 forever74
我能,谢谢你  受教了
#15
waterstar2019-03-19 15:17
运行顺序取决于你使用的编译器,甚至可以从这个值来推算你的编译器是如何编译这些未定义行为代码的
比如我的输出值就是:15,24,8,8
就说明p=(i++)+(i++)+(i++); 这行代码等于p = i + i + i; i++; i++; i++;
q=(++j)+(++j)+(++j); 这行代码等价于++j; ++j; ++j; q = j + j + j;

就像wp231957和rjsp两位说的,在实际开发中,这种代码只会被骂,没有意义。
#16
小白加大黑2019-03-19 22:33
回复 15楼 waterstar
你用的是哪种编译器啊  大佬
1