C_and_CPP 板


LINE

前兩樓有提到這個問題與第八誡相關 不過第八誡可能有些不夠清楚 https://reurl.cc/0nZmk https://reurl.cc/YQ0D4 這兩篇看完就可以解開你心中的疑惑 時間有限,讓我為你簡單整理一下部分內容 先從簡單的四則運算開始 int ans = 1+2+3+4; ans是10 原因是加法的結合方向(associativity) 加法的結合方向是向左,可得到: (((1+2)+3)+4) *下方有結合方向的補充 再來複雜一點的 int ans = 1*2+6/3; ans是4 因為((1*2)+(6/3))而不是(1*(2+6)/3) 是由於乘法(*)運算子優先權(precedence)較加法(+)高 國小四則運算口號: 先乘除,後加減,括號要先算 根據口號,但是要先算(1*2)還是(6/3)? 兩個括號的結果互相'獨立',其中一個先算不影響答案 1 * 2 = 2不影響後面的(6/3),這就是我指的獨立 回到你問的兩個例子 c = sub1(a,&b)+sub2(&a,b); 是加號左邊先還是右邊先算(先求值) '先算'涉及求值順序(Order of evaluation) 求值順序沒有'左到右'或'右到左'的順序 printf("%d\n%d\n%d\n%d\n",a+b+c+d,(b*=a),(a+=d),(d++)); a+b+c+d, (b*=a), (a+=d), (d++) 以上四個求值地位相同,不會有哪個求值一定會先做 由於一個向左,一個向右,加上國小口號 讓你誤會存在'執行順序方向',實際上執行順序是假議題 沒有一個執行順序方向,各自表述的空間 是因為你的求值並非'獨立',所以你才被電腦(可能是編譯或是執行時期)誤導 希望你看完,更能體會第八誡字句的含意(以下為第八誡節錄) 當一段程式碼中,某個變數的值用某種方式被改變一次以上, 例如++x/--x/x++/x--/function(&x)(能改變x的函式) - 如果Standard沒有特別去定義某段敘述中哪個部份必須被先執行, 那結果會是undefined behavior(結果未知)。 - 如果Standard有特別去定義執行順序,那結果就根據執行順序決定。 個人臆測: 不定義執行順序是為了保持與數學運算邏輯的相容性 讓C語言優雅又好入門的方法 其實把敘述一行行寫出來,並不會遜於用一行完成 追求程式邏輯清晰比短小可能來的重要 *結合方向http://codepad.org/hR8UFMOb 我想這個例子應該可以說明,乘除法向左結合的特性 結合方向遇上非獨立的求值還是會有問題的 最後送給原Po: '凡物皆數'----畢達哥拉斯 C語言裡大家都是傳值,不要分這麼細 很少發文,請鞭小力一點 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.237.199.112
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1557551006.A.060.html
1F:推 Schottky: 推 05/11 13:55
2F:推 ohmylove347: 推 05/11 15:45
3F:→ RishYang: 編譯器可以檢查Wsequence-point 05/11 16:35
4F:→ RishYang: 編譯-Wall起來,八誡不會難 05/11 16:38
5F:推 cuttheshit: 感謝大大耐心解惑 雖然還是不太懂 決定先跳過這個點了 05/11 16:51
6F:→ cuttheshit: "以上四個求值地位相同,不會有哪個求值一定會先做" 05/11 16:53
7F:→ cuttheshit: 編譯結果那四個參數的取值順序是 4,3,2,1 05/11 16:54
8F:→ cuttheshit: 那為何不能是 4,2,3,1呢 不禁有這樣子的疑惑 05/11 16:54
9F:→ cuttheshit: 因為第一條式子也是"後面的結果先做有可能改動到前面" 05/11 16:56
10F:→ cuttheshit: 的情況 可是卻可以是從左邊開始算 05/11 16:56
11F:推 cuttheshit: 若是第二條用"因為後面先做會影響到前面的結果,所以先 05/11 17:00
12F:→ cuttheshit: 做後面" 那麼又跟第一條式子矛盾了 主要是卡在這裡 05/11 17:01
13F:推 cuttheshit: 原本做題目好好的,自從遇到case2那條奇怪的式子後 05/11 17:06
14F:→ cuttheshit: 反而導致往後做時,一直會冒出一個念頭 是不是該後往前 05/11 17:07
15F:→ cuttheshit: 有種一知半解最危險的感覺,反而會顧慮太多 05/11 17:09
16F:推 art1: 「不要在一個運算式中,寫出變數會互相影響的程式碼」 05/11 17:20
17F:→ RishYang: 在這個問題上不用擔心會有一知半解的情形 05/11 18:11
18F:→ RishYang: art1所言是整篇重點,沒有這種疑義才是良好的程式碼 05/11 18:18







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP