| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2187 人关注过本帖
标题:有人理解我的疑问吗?请教前辈指教。
只看楼主 加入收藏
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
有人理解我的疑问吗?请教前辈指教。
不能发图,我直接打字。

内容范围:
C语言只对4个运算符规定了它们对应多个操作数的定值顺序,分别为:与运算符&&、或运算符||、逗号运算符,、条件运算符?:

不懂的内容原文1:
除了运算符"&&" 、"||" 、 "?:" 和 "," 之外,如果设计的程序还依赖于其他运算符的操作数的定值顺序,这样的程序往往会出现错误,因为编译器对操作数的定值顺序与你想像的并不一样。
本人疑问:
这是否说明 (a == 1) && (b != 0)或直接 a==1 || b!=0 这样的表达式是会出现错误的?而且它后面提到的编译器操作就更不明了。
不懂的内容原文2:
除了运算符"&&" 、 "||" 、 "?:"和","之外,如果程序还依赖于其他运算符的操作数的定值顺序,那么程序的功能会随着编译它的编译器的不同而不同。
本人疑问:
第一点都不懂了,那这第二点说编译器不同有不同结果的情况,跟++重复于一个表达式里出现的错误属于一样的现象吗?

确实不懂,消化不了,往有人明白含义并指点一二,谢谢!

搜索更多相关主题的帖子: 编译器 表达式 C语言 而且 
2015-03-17 21:31
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:7 
如果你怕编译结果不符合你的设计思路,那么:
1,避免这种含糊不清的语句
2,记清运算符的优先级顺序
3,实在忘了,万能的 ()  括起来。

你醒了?快起来敲代码!!
2015-03-17 22:07
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 2楼 code力力
谢谢,这个明白,但我看的书出现了这样的描述导致了我的困惑。正如第一条疑问
 (a == 1) && (b != 0)或直接 a==1 || b!=0
这会导致错误或看编译器面色吗?还是我理解错了?
2015-03-17 22:44
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 楼主 kin3z
这段描述出自
《C大学教程(第五版)》(美)戴特尔
187页里的
常见的编程错误5.17

可移植性提示5.2


2015-03-17 22:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
不要斷章取義,把前後文放出來。

授人以渔,不授人以鱼。
2015-03-17 23:13
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 5楼 TonyDeng
常见的编程错误 5.17
除了运算符“&&”,“||”,“?:”和“,”之外,如果设计的程序还依赖于其他运算符的操作数的定值顺序,这样的程序往往会出现错误,因为编译器对操作数的定值顺序与你想像的并不一样。
可移植性提示 5.2
除了运算符“&&”,“||”,“?:”和“,”之外,如果程序还依赖于其他运算符的操作数的定值顺序,那么程序的功能会随着编译它的编译器的不同而不同。

以上为原文了。。。前面还有一段关于此方面的说明,截取如下:
C标准只对四个运算符规定了他们对应的多个操作数的定值顺序,这四个运算符分别是:与运算符(&&),或运算符(||),逗号运算符(,)和条件运算符(?:)。前三个运算符属于二元运算符,他们对应的两个操作数的定值顺序都是从左向右的[注意:用来分割运算符的逗号不是逗号运算符]。最后一个运算符是C语言唯一一个三元运算符,它总是首先计算最左边操作数的值。如果最左边操作数的值为非零,则计算中间那个操作数的值,而最后那个操作数将被忽略掉。如果最左边操作数的值是零,则计算第三个操作数的值,而中间那个操作数将被忽略掉。
常见的编程错误 5.17
。。。。
2015-03-17 23:54
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
这2个写法效果都是一样的       (a == 1) && (b != 0)或直接 a==1 || b!=0
    (a == 1) && (b != 0)

不知道你的书在说明这个提示的时候前面用了什么案例

你是想的太麻烦了的,不要想太多。

[ 本帖最后由 code力力 于 2015-3-18 00:03 编辑 ]

你醒了?快起来敲代码!!
2015-03-18 00:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這部分衹是說:按照C標準,明確規定了操作數定値順序的衹有那4個,其餘的都沒有規定,是由編譯器實現自由確定,所以當你的代碼包含那4個運算符之外的運算符時,不要輕易假定操作數的定値順序。

換言之,最佳實踐,就是按規範告誡的:用自己明確的方式强制編譯器按自己的意圖解釋,即不要依賴優先級,用括號把意圖表達清楚,那才是可控的。

實際上,那書上的這些敘述屬於多餘,也還有漏洞。那個漏洞就是,某些運算有短路規則,尤其是||,當左邊的運算足以確定結果時,則不執行右邊的運算,但你卻可能期望程序會在右邊的表達式中執行某些附加動作,這樣就會出乎意料。

授人以渔,不授人以鱼。
2015-03-18 00:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
書上的話,應是針對古老的某種説法而來的。在一些比較古老的教材上,會教導學生說,C語言的表達式求値順序是棧式的,從右至左,於是有一些程序員會刻意利用這一特性,通過假定先執行右邊依次到左邊的次序,安排一些動作按順序執行,達到少寫幾行代碼的目的,屬於取巧行爲(很多人以此爲能的)。但現代的編譯器,卻未必是這樣,C標準也沒硬性規定編譯器要按某種順序對表達式求値(這些東西最多表現在函數傳參上),所以書上應是針對那種現象而說的。如果不看不學那些太老舊的書,本來啥事沒有,現在在對方不知道那些陋習的情況下主動提起,反倒引起困惑。但是不管怎樣,你按我8樓第二段說的最佳實踐做就是了,少取巧方是大聰明。

舉個例子:
程序代码:
if (i++ || j++)
{
    ....
}

這個if()運算,就暗藏了陷阱,如果當前i的値不是零,那麽j++就沒有執行,但你其實可能期望在執行i++之後會執行j++的,事實上卻是偶爾的不執行,那就弄死你了。這樣的代碼,還是很明顯的,還有更陰的,諸如if (fun1(&i) || fun2(&j)) {}之類,你極可能沒意識這裏的i、j値依賴於函數是否執行。


[ 本帖最后由 TonyDeng 于 2015-3-18 00:30 编辑 ]

授人以渔,不授人以鱼。
2015-03-18 00:24
lovegh
Rank: 5Rank: 5
来 自:图灵学院
等 级:职业侠客
威 望:3
帖 子:117
专家分:311
注 册:2015-1-23
收藏
得分:7 
……不知为什么,我从来不去记这些什么优先级别,也就那几个,用着用着就相当于说普通话那样自然了,这不是重点,何必去关注。

别老是写代码,要多陪妹子,多了解老婆大人,血淋淋的教训。
2015-03-18 00:26
快速回复:有人理解我的疑问吗?请教前辈指教。
数据加载中...
 
   



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

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