LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: alvas

i=2,(++i)+(++i)+(++i),最后求结果,在fc4中得13

 关闭 [复制链接]
发表于 2006-1-4 09:41:55 | 显示全部楼层
我的认为是这样的呀:
逗号表达式的值为最后一项的值。
int a = 0;
a = (12, 3);
产生的代码是12被丢弃,3赋值到a,所以结果是3,没异议吧。

再看下面:
int a = 0;
a = 12, 3;   
这不算一个逗号表达式,=优先级大于,且这个表达式意义相当于 a = 12, (null) = 3;
结果应该是 a = 12, 3被丢弃。

所以 =>        
int i = 0;
i = 2,(++i)+(++i)+(++i);

第一步: i = 2;
第二步: i + 1;
第三步: i + 1;
第四步: i + 1;

结果是5。
回复 支持 反对

使用道具 举报

发表于 2006-1-4 09:44:02 | 显示全部楼层
注意: 28楼的代码没有按照LZ的原式,虽然也是对的,但含义不同。
回复 支持 反对

使用道具 举报

发表于 2006-1-4 16:45:30 | 显示全部楼层
正常啊,不同编译器解释不同。。。。
不标准代码
int sum,i=2;
int adsjifvao=i++;
sum=adsjifvao+adsjifvao+adsjifvao;
printf................
回复 支持 反对

使用道具 举报

发表于 2006-1-4 16:52:36 | 显示全部楼层
Post by iNPRwANG

a = 12, 3;   
这不算一个逗号表达式,=优先级大于,且这个表达式意义相当于 a = 12, (null) = 3;

........这是个逗号表达式
你的优先级低理由不成立,因为逗号优先级最低,按照你的说法除了3,4这种纯粹数字的exp1,exp2才构成逗号表达式

你的意义解释是对的,所以我猜你说的是
不能把12,3看作一个逗号表达式,a=12,3才是一个逗号表达式。
回复 支持 反对

使用道具 举报

发表于 2006-1-4 17:07:08 | 显示全部楼层
锁贴吧,不如
不要在浪费时间了
回复 支持 反对

使用道具 举报

发表于 2006-1-4 23:05:44 | 显示全部楼层
这种问题比较适合闲聊时的谈资,呵呵
我还是比较关心什么时候会用到这种语句

举个例子:
小王所在公司的薪水每年递涨1万元,
今年小王的年收入是两万元,请问在未来三年内小王的总收入是多少?

哈哈,只有这种情况才会这么用吧?哈哈,都说程序语言要结合实际生活来理解.
回复 支持 反对

使用道具 举报

发表于 2006-1-4 23:35:54 | 显示全部楼层
请看看我前面的留言
正常的程序里永远不会出现这种语句
除非你知道你的程序永远只在一个机器上用同一个编译器编译
回复 支持 反对

使用道具 举报

发表于 2006-1-5 09:25:26 | 显示全部楼层
Post by Thruth
........这是个逗号表达式
你的优先级低理由不成立,因为逗号优先级最低,按照你的说法除了3,4这种纯粹数字的exp1,exp2才构成逗号表达式

你的意义解释是对的,所以我猜你说的是
不能把12,3看作一个逗号表达式,a=12,3才是一个逗号表达式。


对呀,你自己不是自己已经说明了理由吗?

","优先级比"="低,而"="是"由右向左"方式结合的,再重复一编推论:
a=1,2,3; 结果应该是 a = 1,后面东西一律无效。
除非用a=(1, 2, 3)改变优先级。

这是个C运算符优先级的基础问题,说是编译器问题的都是冒充大牛的,本身不愿举证解释的。
我在gcc2.3,VC6,lcc上试验过,答案一致!如果哪个编译器出来的结果不一致,可以确定是它本身的问题。
回复 支持 反对

使用道具 举报

发表于 2006-1-5 10:33:22 | 显示全部楼层
逗号那个是没有问题的
(太平洋网上的原题倒没有这个逗号,sigh)

主要是那个连着的++i

你可以加个-Wall试试看
即使现存所有的编译器都是这个结果
也不能说明这样写程序是正确的
C语言标准没有明确定义过这样的表达式的结果

我找了一下这个问题的根源
http://www.pconline.com.cn/pcjob ... rs/0511/725226.html
这贴真的可以锁了
rickxbx?
回复 支持 反对

使用道具 举报

发表于 2006-1-5 10:51:16 | 显示全部楼层
http://open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf
6.5 Expressions
....
2. Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored.71)

71是脚注:
This paragraph renders undefined statement expressions such as
i = ++i + 1;
a[i++] = i;
while allowing
i = i + 1;
a = i;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表