24小时热门版块排行榜    

查看: 1904  |  回复: 32

sunchuanxi

新虫 (初入文坛)

[求助] 关于c语言中++i计算的问题已有4人参与

请问q的值为多少,我试了下是22,但不理解
#include "stdio.h"
void main()
{
int j=5,q;
q=(++j)+(++j)+(++j);
printf("%d",q);
}
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

virtualzx

木虫 (著名写手)

【答案】应助回帖

按照c++规定的解析顺序规则,应自左向右逐个计算每个++i表达式的值并相加,每次取值前i的值递增1,因此得到21。
然而C++是十分重视速度和优化的语言,C++标准允许编译器在不改变结果的情况下任意变换表达式的结构。但是当变量的值在表达式内变化时,编译器很难优化,所以C++标准第五章第四条规定,在任何两个顺序点之间(这里分号;就是顺序点。其他顺序点包括比较算符和不同变量的初始化分隔符等),任何标量变量的值最多改变一次。
编译器是无法在编译时判断变量改变次数的,因此你的语句并不会被拒绝,但是它还是可以以最多变化一次为假设对表达式变形,而这是不正确的假设,因此这时得到的值就不一定和标准顺序规定的值一致,不同编译器都会得到不同结果,甚至不同版本结果都会不同(vc++里甚至按照debug和release编译得到的结果都不一定一样)
究其原因,是因为这个语句本身已经违反了C++标准。其他语言如C#就规定编译器必须严格遵守求值顺序不能随意变换,但速度会受影响

发自小木虫IOS客户端
16楼2016-04-26 12:10:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

breezefp

新虫 (初入文坛)

应该和编译器有关,我用clang,oc的编译器,是21

发自小木虫Android客户端
4楼2016-04-25 22:28:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

吟游诗人丶夏

新虫 (初入文坛)

百度的答案。。。当i=1时。。j=(++i)+(++i)+(++i)=(((++i)+(++i))+(++i))
计算机在计算j=(a+b)+(c+d)+(e+f)先计算(a+b)+(c+d),并把结果存储(例如:存储在j中),然后再计算j+(e+f)=j;
所以计算机先计算了两个++i(前两项i为3,++i先于+号);也就是j=3+3;然后j=6+(++i)(最后的i为4),也就是j=6+4=10。

首先++i=2,再计算第二个++i=3,此时计算机里i=3,第一个i也=3,第二个i也=3,因为计算机里只有一个i,因此原式=(3+3)+4=10,记住计算机里只有一个i,算第二个时第一个i改变了

发自小木虫Android客户端

» 本帖已获得的红花(最新10朵)

7楼2016-04-25 23:06:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

wo2cast

木虫 (著名写手)

【答案】应助回帖

感谢参与,应助指数 +1
的确好神奇,我还以为是21呢。
在  q=(++j);                        的时候,输出  6
在  q=(++j)+(++j);                的时候,输出  14  !//这里为啥不是13呢?
在  q=(++j)+(++j)+(++j);       的时候,输出 22  !
'“万事开头难”“之后呢?”“之后你就习惯了”
2楼2016-04-25 22:03:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sunchuanxi

新虫 (初入文坛)

引用回帖:
2楼: Originally posted by wo2cast at 2016-04-25 22:03:45
的确好神奇,我还以为是21呢。
在  q=(++j);                        的时候,输出  6
在  q=(++j)+(++j);                的时候,输出  14  !//这里为啥不是13呢?
在  q=(++j)+(++j)+(++j);       的时候, ...

对呀,不知道怎么算的

发自小木虫Android客户端
3楼2016-04-25 22:17:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sunchuanxi

新虫 (初入文坛)

引用回帖:
4楼: Originally posted by breezefp at 2016-04-25 22:28:56
应该和编译器有关,我用clang,oc的编译器,是21

我用vc6.0和codeblock编译都是22

发自小木虫Android客户端
5楼2016-04-25 22:45:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sunchuanxi

新虫 (初入文坛)

我是在一本书上看的,书上写的结果是24

发自小木虫Android客户端
6楼2016-04-25 23:02:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

吟游诗人丶夏

新虫 (初入文坛)

引用回帖:
7楼: Originally posted by 吟游诗人丶夏 at 2016-04-25 23:06:46
百度的答案。。。当i=1时。。j=(++i)+(++i)+(++i)=(((++i)+(++i))+(++i))
计算机在计算j=(a+b)+(c+d)+(e+f)先计算(a+b)+(c+d),并把结果存储(例如:存储在j中),然后再计算j+(e+f)=j;
所以计算机先计算了两个++i( ...

同理最后一段运用到你这个式子上也一样也是21吧,。转自新浪爱问。。鱼鹰

发自小木虫Android客户端
8楼2016-04-25 23:09:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

爱风happy

新虫 (初入文坛)

http://bbs.bccn.net/m.thread.php?tid=295651   这个链接有详解,可以参考,有助于理解!

发自小木虫Android客户端
9楼2016-04-26 01:00:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

virtualzx

木虫 (著名写手)

【答案】应助回帖

感谢参与,应助指数 +1
正确输出是21,如果得到别的结果就是你的编译器有bug

发自小木虫IOS客户端
10楼2016-04-26 07:13:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 sunchuanxi 的主题更新
信息提示
请填处理意见