24小时热门版块排行榜    

查看: 780  |  回复: 12

duzongyin

银虫 (小有名气)

[求助] 请教

#include
main()
{
   int a;
   a=1;
   b=++a+ ++a+ ++a;
   printf("%d\n",b);
}
请教此输出结果是多少?并请教如何计算的...谢谢
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

★ ★
余泽成(金币+2): 谢谢参与应助! 2012-03-11 23:25:41
网上抄了一段,你可以去翻下标准确认下,嗯

"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 accessed only to determine the value to be stored."

"This paragraph renders undefined statement expressions such as
i = ++i + 1;
a[i++] = i;
while allowing
i = i + 1;
a = i;"

简单地讲就是:同一个表达式如果多次改变同一个变量的值,行为未定义。你给出的是一个最典型的情况,因此,在不同编译器编译出来的结果,甚至是同一个编译器不同优化选项的编译结果,都可能得到不同的结果。

然后,如果面试被问到这个题,说出上面那段话应该就挺好的。如果是在试卷上看到,那么那个试卷可以扔进垃圾堆
2楼2012-03-05 17:16:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)


余泽成(金币+1): 鼓励讨论! 2012-03-11 23:25:51
引用回帖:
2楼: Originally posted by sudo at 2012-03-05 17:16:29:
网上抄了一段,你可以去翻下标准确认下,嗯

"Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthe ...

恩,这个就好比编译器的方言,各地不同。
很女子很弓虽大
3楼2012-03-05 19:00:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

denganliang

银虫 (小有名气)

【答案】应助回帖


感谢参与,应助指数 +1
jjdg(金币+1): 感谢应助 2012-03-08 01:59:10
你变量b怎么没有声明啊!!!
欢迎大家访问我的网站:http://aizaoqi.com
4楼2012-03-06 09:16:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

十年磨练

木虫 (正式写手)

【答案】应助回帖


感谢参与,应助指数 +1
jjdg(金币+1): 感谢应助 2012-03-08 01:59:16
应该输出12
因为这要考虑运算符号的优先顺序,++比+的的优先级别高,先算++,即a进行了三次自加一的a=4,然后计算b的值,即b等于三个四相加:b=12
时刻保持虚心学习的态度
5楼2012-03-06 13:27:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

duzongyin

银虫 (小有名气)

引用回帖:
: Originally posted by denganliang at 2012-03-06 09:16:23:
你变量b怎么没有声明啊!!!

是的 犯错了 呵呵
6楼2012-03-06 19:10:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

duzongyin

银虫 (小有名气)

引用回帖:
: Originally posted by sudo at 2012-03-05 17:16:29:
网上抄了一段,你可以去翻下标准确认下,嗯

"Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthe ...

非常感谢 这个问题我想了很成时间一直没有相处是怎么回事...
7楼2012-03-06 19:11:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

duzongyin

银虫 (小有名气)

引用回帖:
: Originally posted by 十年磨练 at 2012-03-06 13:27:11:
应该输出12
因为这要考虑运算符号的优先顺序,++比+的的优先级别高,先算++,即a进行了三次自加一的a=4,然后计算b的值,即b等于三个四相加:b=12

谢谢 按理说是这样的,但是在编译器上不是这样..非常感谢...
8楼2012-03-06 19:12:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

★ ★
余泽成(金币+2): 鼓励讨论! 2012-03-11 23:26:11
引用回帖:
8楼: Originally posted by duzongyin at 2012-03-06 19:12:13:
谢谢 按理说是这样的,但是在编译器上不是这样..非常感谢...

这个题如果这么问才有意义

d = ++a+++b+++c

或者来这个

c = a+++++b

不符合标准的问题是没有意义的,undefined behavior的意思是编译器怎么做都有道理

上面的问题符合标准了,虽然仍然实际程序不会这么做,会使得程序可读性差
9楼2012-03-07 09:19:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

duzongyin

银虫 (小有名气)

引用回帖:
: Originally posted by sudo at 2012-03-07 09:19:16:
这个题如果这么问才有意义

d = ++a+++b+++c

或者来这个

c = a+++++b

不符合标准的问题是没有意义的,undefined behavior的意思是编译器怎么做都有道理

上面的问题符合标准了,虽然仍然实际程序不 ...

如果这样的活就是一个表达式中有四个变量了(d=++a+++b+++c)若赋初值的话如a=b=c=1,d=6吗 还有若是第二个式的话 应怎么处理前缀和后缀运算呢?谢谢
10楼2012-03-07 16:14:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 duzongyin 的主题更新
信息提示
请填处理意见