24小时热门版块排行榜    

查看: 2025  |  回复: 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的回帖

virtualzx

木虫 (著名写手)

【答案】应助回帖

引用回帖:
14楼: Originally posted by stdlib_h at 2016-04-26 11:51:36
不能说的到21、22 是编译器bug,这个和编译器实现有关,我测试过。
本地iMac,结果 21 (clang)
ideone和cpp.sh、Linux上、FreeBSD以及其他所有gcc版本上结果均为:22
ideone:  http://ideone.com/m1XCZV  
cpp. ...

24是因为vc认定三个++i的值是一样的,因为根据§5/4可以推测出所有左递增/递减算符可以提取到表达式之前,又递增递减算符都可以提取到表达式之后的结论,因此VC将这一表达式转化为
++i; ++i; ++i;
i+i+i

”谁会写出这样的语句”?其实几乎每个人都会,而且也是个重要的问题。这不只是表达式写法,而是C/C语音不完全解析顺序导致的。其他面向对象语言几乎都是可以不含糊的解析顺序的。这不只是++算符而已,如果任何表达式里有两个以上有side effect的函数,都有可能导致问题。这类含糊表达式非常常见,比如printf(..., x,f(x))这样简单的语句,如果f函数改变x的值,不同编译器都可能会给出不同的结果。
其他的例子,比如f(getc(), getc()),还有i=i++,还有以至于obj.f1()+obj.f2()这样常见的表达式,如果两个函数都有副作用,结果就可能因编译器不同而不同!

而这都是§5/4的结果。其实解析求值顺序不是不可能的,但是C本着速度第一的原则有意放松了标准

一个解决办法是,写程序时保证任何有返回值的函数没有副作用;而有副作用的都写成过程;但这样引入很大难度,实际上任何程序员都会写出很多依照标准含糊的C++表达式的。这也是提出C#语言的一个主要的原因之一。

发自小木虫IOS客户端
20楼2016-04-27 09:42:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 33 个回答

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的回帖

breezefp

新虫 (初入文坛)

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

发自小木虫Android客户端
4楼2016-04-25 22:28:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见