| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1136 人关注过本帖
标题:C语言函数参数计算次序的问题
只看楼主 加入收藏
笨女孩
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2011-7-13
结帖率:100%
收藏
已结贴  问题点数:16 回复次数:5 
C语言函数参数计算次序的问题
int x=10;
int y=x++;
printf("%d,%d\n",(x++,y),y++);
函数参数的次序是自右向左,理应是输出  11,10
但运行的时候却输出的是10,10;
搜索更多相关主题的帖子: 函数 计算 C语言 
2012-01-25 17:32
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
收藏
得分:4 
10,10没错,首先y=x++;等价于y=x,x=x+1;所以y==10;而(x++,y)是逗号运算,取值取y值,y++也是先做输出在自加1,所以输出为10,10.没错。

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2012-01-25 17:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
參數傳遞順序與函數結果沒有必然聯繫,標準庫函數不會寫出依靠參數傳遞順序決定結果的代碼,除非那個函數是你自己寫的。你再三再四地糾結於這種順序問題,是不是看的教材和考試題目很多這種東西?

授人以渔,不授人以鱼。
2012-01-25 18:06
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:4 
看见过类似的问题,不同的IDE结果不同,因为在同一个表达式用了多个自增自减。建议还是分开写

酱油实习生
2012-01-25 19:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1樓的代碼,與自增自減連在一行運算順序不確定不同,運算本身都是後綴形式的,不至於影響結果。樓主的疑惑,是以為printf()函數輸出的順序也與參數壓棧順序有關,而且是分行的,這是對函數處理的誤解。其實,縱使參數傳遞是壓棧式的,也不會因最右邊有個y++就把它運算了後綴式自增再算前面的參數,除非那是前綴式自增,那樣,就會出現不確定因素。

很多時候,語言雖然沒有明令禁止某種寫法,但並不因此說你就可以毫無節制地運用這種寫法,C語言的模糊語法比別的語言都多。我不知道某些教材和中國大陸的科舉考試是怎麼回事,總愛在這樣的問題上折騰,誤人子弟。

編程規範都有教導:“儘量避免使用語言的偏僻特性”。C語言的參數傳遞是壓棧式的,這是C語言本身的特性(因此涉及C語言參數傳遞的聲明都有一個獨特的標誌提醒使用者那是C方式),別的語言通常不是那樣的,因此這是一種沒有通用性的參數傳遞規則,無論是學習編程還是實際編程,都不要刻意運用這種獨特性,養成了這樣的習慣,與別的語言交換數據時自找麻煩不說,這樣寫出來的代碼帶有獨特的思想特點妨礙別人理解和維護你的程序才是最嚴重的問題。

在以前,老的編譯器和舊的機器上,有人確實會運用這種“技巧”精簡代碼,但現代編程知識早已提醒我們,新式的編譯器和機器硬件可能有各種各樣不同的外部優化手段,程序的運行表現未必如你代碼編寫的那樣,人家的優化只確保沒有語言禁止的東西,但不確保使用語言沒有禁止的東西,你如果使用了“未經定義的”行為代碼,那麼程序表現古怪就一點都不古怪了。依靠參數傳遞順序進行副作用代碼編寫,就是這類不值得提倡的行為。C程序員利用副作用編寫代碼的比例比任何語言的程序員都多。

[ 本帖最后由 TonyDeng 于 2012-1-25 20:11 编辑 ]

授人以渔,不授人以鱼。
2012-01-25 19:52
笨女孩
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 3楼 TonyDeng
恩,对啊,笔试就考这些细节,上机才是写程序。
2012-01-25 20:58
快速回复:C语言函数参数计算次序的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022389 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved