y=f(x,x++,x++);

殇(406093635) 15:01:35
#include "stdio.h"
int f(int a,int b,int c)
{
int z;
z=a+b*c;
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
return z;
}
void main ()
{
int x=3,y;
y=f(x,x++,x++);
printf("%d\n",x);
printf("%d\n",y);
}
结果是a=3;b=3;c=3,x=5,y=12
为什么不是a=5,b=4,c=3   或者a=3,b=3,c=4
有人知道吗?
白屋(234547934) 15:04:17
当然是a=3;b=3;c=3,x=5,y=12啦~

函数f 没有传入地址~ 所以值是不会被修改的
白屋(234547934) 15:05:12
执行 y=f(x,x++,x++);
x 还是3
到 了printf("%d\n",x);
x ++ 两次~ 为5
殇(406093635) 15:05:18
如果我把最后那个x++改写成++x,结果应该是?
白屋(234547934) 15:05:42
a=3;b=4;c=5
殇(406093635) 15:05:45
y=f(x,x++,++x);
白屋(234547934) 15:05:56
3 4 4
殇(406093635) 15:06:01
这个结果怎么说呢?
白屋(234547934) 15:06:00
错了
白屋(234547934) 15:06:04
3 3 4
殇(406093635) 15:06:07
我没太懂
白屋(234547934) 15:06:28
++ 在前 是先自家
++ 在后 是先运算 后自家
H264(279373002) 15:07:09
...
殇(406093635) 15:07:23
结果是4 4 4
殇(406093635) 15:07:46
不是这个自加的问题
殇(406093635) 15:09:53
是为什么x++对于abc的值没有起到作用,但是++x却能起到作用
白屋(234547934) 15:10:49
你在网上看看++ 在前在后的区别就知道了
靖边侯(419073800) 15:11:17
在264 的码流中能不能加入一些噪声??
tmuc_HM(289865849) 15:12:30
我是这样理解的
tmuc_HM(289865849) 15:13:13
参数在函数里作用的时候作用的是原参数的副本,而副本的初始化值就是你传进去的参数的值
tmuc_HM(289865849) 15:13:23
所以刚才的问题就可以解释了
殇(406093635) 15:14:05
那你能说说y=f(x,++x,++x);
的结果吗?
殇(406093635) 15:14:34
现在这个的结果是a=5;b=5;c=4
殇(406093635) 15:15:17
按你的解释就应该是3 4 4或者4 4 4 
殇(406093635) 15:15:18
对吧
tmuc_HM(289865849) 15:15:23
我觉得应该是参数的传递顺序是从右至左传度
tmuc_HM(289865849) 15:15:24
传递
殇(406093635) 15:15:38
对 是从右向左
tmuc_HM(289865849) 15:15:41
这样的话,就是4,5,5
CTCA(172350634) 15:15:52
,表达式应该是从左往右吧
殇(406093635) 15:15:54
你能合理解释为什么是5  5   4
加菲学视频(1023266328) 15:15:56
x++改写成++x,在前和在后不一样,昨天我才查过书
H264(279373002) 15:16:03
这个莫非是C语言二级的考试题
加菲学视频(1023266328) 15:16:11
C++里也有
CTCA(172350634) 15:16:14
函数入栈是右往左
白屋(234547934) 15:16:27
printf  是从右往左
CTCA(172350634) 15:16:30
但是这种二义性写法,实际项目中是禁止使用的
tmuc_HM(289865849) 15:16:43
x=3
参数顺序先传递c
x给形参传值后变为4,后面依次类推
f(x,++x,++x)
CTCA(172350634) 15:16:45
过于依赖编译器
殇(406093635) 15:16:48
谁能解释y=f(x,x++,++x);的时候是
a=5;b=5;c=4
 
白屋(234547934) 15:16:49
有一些编译器不是~ 这是个很纠结的问题
诗魁(258275326) 15:17:01
这个和编译器有关系的
殇(406093635) 15:17:25
那你这个在语法上本来应该是什么结果呢

加菲学视频(1023266328) 15:17:55
递增操作符的后置和前置问题,在前置形式中,当前值先被递增或递减1,然后再使用它的值
 
tmuc_HM(289865849) 15:18:13
这个其实就是参数传递的问题,顺序是从右至左
CTCA(172350634) 15:18:31
真要研究这个,建议先阅读一次编译器源代码,很多问题就能弄清了
CTCA(172350634) 15:18:47
例如
x=3
y = x+++++x;


y=?
殇(406093635) 15:19:09
tmuc_HM   你的说法不能解释为什么在y=f(x,x++,x++);的时候结果是3 3 3
 
tmuc_HM(289865849) 15:19:35
擦,我自己也晕了
codec(494151263) 15:19:37
大家静一下,我来说一句
逍遥风云(104051280) 15:19:49
y=7
codec(494151263) 15:20:00
这个问题是c语言中的Side Effect
CTCA(172350634) 15:20:20
逍遥风云(104051280)  15:19:49
y=7

还有没有其它答案
codec(494151263) 15:20:20
在C语言中是未定义的,与编译器实现有关 
 殇(406093635) 15:20:35
谁能在两种情况之间找到合理的解释吗?
诗魁(258275326) 15:20:36
我刚在VS2008试了下,居然发现是 a=5,b=4,c=3,5 ,17这是什么情况。。。
codec(494151263) 15:20:38

殇(406093635) 15:20:45
是的
殇(406093635) 15:20:53
我的编译器就是这样的答案
codec(494151263) 15:21:01
这是C语言Undefined的
codec(494151263) 15:21:08
与编译器有关
诗魁(258275326) 15:20:58

codec(494151263) 15:21:41
你们可以google一下Side Effect与Sequence Point
殇(406093635) 15:22:13
在f(x,x++,x++)以及f(x,++x,++x)之间还没有人能解释结果
codec(494151263) 15:22:36
。。。。。。。。。
CTCA(172350634) 15:22:41
f(x,x++,x++) -> f(5, 4, 3)
CTCA(172350634) 15:22:59
f(x,++x,++x) -> f(5, 5, 4)
CTCA(172350634) 15:23:11
GCC/VC下应该是这个结果
tmuc_HM(289865849) 15:23:15

tmuc_HM(289865849) 15:23:16
是的
加菲学视频(1023266328) 15:23:21
其实很简单,书上说的很明确,后置形式,是先使用原值,然后下次才用新的值
tmuc_HM(289865849) 15:23:21
应该是这个结果
CTCA(172350634) 15:23:27
x86平台,换平台后不一定
殇(406093635) 15:23:39

殇(406093635) 15:23:54
f(x,x++,x++) 
codec(494151263) 15:24:03
跟你说了吗,这是c未定义的
codec(494151263) 15:24:11
跟你的编译器实现有关
CTCA(172350634) 15:24:39

殇(406093635) 15:24:40
那今后编程的时候这种问题怎么弄?
CTCA(172350634) 15:24:48
都改行研究编译器构造了?
殇(406093635) 15:24:49
你都不知道会出现什么结果
codec(494151263) 15:24:54
你一定要这样写吗
白屋(234547934) 15:25:03
只有考试才会这样写吧~ 
CTCA(172350634) 15:25:09
实际项目中不可能遇到,竞赛时遇到就随便写吧
codec(494151263) 15:25:09
标准未定义的最好不要用啊
殇(406093635) 15:25:20
因为不确定所以不用
codec(494151263) 15:25:29
因为人家c都不确定
抱柱者(86311414) 15:25:49
1、首先,函数参数的传入顺序在大部分的系统中是自右向左的。
2、一个二目运算符的两个值的计算顺序是没有规定的。比如,x = (a++) * (b++) + c; C语言只是规定了 * 必须在 + 之前计算,但并没有规定 * 的左边(a++) 必须在(b++) 之前计算。
codec(494151263) 15:26:19
这就是所谓的Side Effect
殇(406093635) 15:26:23
好吧   我想多了
殇(406093635) 15:26:28
呵呵
逍遥风云(104051280) 15:26:32
编译原理
抱柱者(86311414) 15:26:33
但并没有规定 * 的左边(a++) 必须在右边(b++) 之前计算。
殇(406093635) 15:26:40
只是没有想到会有这样的事情
殇(406093635) 15:27:01
一直以为这么成熟的东西应该不会有黑洞
CTCA(172350634) 15:27:05
抱住,你解释下y=x+++++x;的值
codec(494151263) 15:27:07
比如这个
int a=0;
a = (++a)+(++a)+(++a)+(++a);
抱柱者(86311414) 15:27:21
不然为什么一再建议别使用有副作用的写法呢?
CTCA(172350634) 15:27:40

codec(494151263) 15:27:43

殇(406093635) 15:27:47
嗯   今后不会了   大家干嘛干嘛

y=f(x,x++,x++); - 加菲 -  .

 

 殇(406093635)  15:27:58
不好意思了 
殇(406093635)  15:28:00
黑洞
逍遥风云(104051280)  15:28:08

CTCA(172350634)  15:28:21

殇(406093635)  15:28:35
不过发现群里面的人很热情
H264(279373002)  15:28:34
只有出考题的那帮专家才会这样出题
殇(406093635)  15:28:37
嘿嘿
CTCA(172350634)  15:28:41
嘿嘿,公布答案吧
y=x+++++x
在大多数编译器下,是编译报错
codec(494151263)  15:28:41

codec(494151263)  15:28:55
编译器也受不了了
codec(494151263)  15:29:00
只好报错
梦中客(415431003)  15:29:03
热情是针对问题的
抱柱者(86311414)  15:29:27
靠!编译器都受不了的问题你要我来分析?
殇(406093635)  15:29:38
哈哈  
抱柱者(86311414)  15:29:39
还好我没听你的
CTCA(172350634)  15:29:47

逍遥风云(104051280)  15:29:48

逍遥风云(104051280)  15:29:50

CTCA(172350634)  15:29:55
现代编译器的一个缺陷
codec(494151263)  15:29:54
这样的问题还有很多啊,比如char 是有符号还是无符号?
殇(406093635)  15:29:58

逍遥风云(104051280)  15:30:04
就是 char 
CTCA(172350634)  15:30:14
按照C语法来说,应该结果是 (x++)+(++x)
CTCA(172350634)  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值