Re: [問題] if ( a && b ) 一定會執行到b嗎?

看板C_and_CPP作者 (autumned)時間14年前 (2011/10/10 23:11), 編輯推噓3(3015)
留言18則, 7人參與, 最新討論串4/4 (看更多)
※ 引述《yoco315 (眠月)》之銘言: ※ 引述《autumned (autumned)》之銘言: : 問題(Question): : 我的程式碼裡有一段 是 : if ( a && b ) 標準有保證這個 short cut, 除了一種狀況以外: 如果 && 是 overloaded operator。 那左右兩邊都會被 evaluate。 -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 182.235.165.45

10/10 10:38,
推!
10/10 10:38

10/10 11:41,
那請問 我的&& 是內建的 但是b是macro 這樣會有問題嗎
10/10 11:41

10/10 11:43,
這就要看你的macro怎麼寫了...
10/10 11:43

10/10 13:36,
個人覺得你直接貼code比較快....
10/10 13:36

10/10 13:36,
另外, a有沒可能踩到某種陷阱以致於你以為a沒成立實際上
10/10 13:36

10/10 13:37,
a成立了?
10/10 13:37

10/10 13:38,
啊, 忘記拆兩個if寫就會好了, 上面當小弟我沒說Orz
10/10 13:38
http://codepad.org/ZoJA4J5D bug是出現在min_heapify的部分 (line 211-212 , 216-217) 使用到的macro 是 line 6,7,9 #define left(i) 2*i #define right(i) 2*i+1 #define lessthan(a,b) (data[a].occur < data[b].occur) || (data[a].occur == data[b].occur && store[a] > store[b]) if( l <= last && lessthan(l,a)) 我一開始是寫成這樣 我測最小的input 檔 沒有問題 但是後面的input就會crash 其中 last 是該陣列的長度-1 a是目前要heapify的元素 我crash時的測資 array總共從0到2004 共2005個值 所以last是2004 然後a是2003 所以l是4006 會超過陣列大小 但是l<= last為false 理當會避免lessthan(l,a)執行? 後來改成像現在這樣 if( l <= last ) if(lessthan(l,a)) 就都沒問題了... 所以比較可能是什麼狀況呢@@還是其實我程式有bug -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.111.3

10/10 23:15, , 1F
macro 沒括號括起來啦!!!!
10/10 23:15, 1F

10/10 23:18, , 2F
0.0!?
10/10 23:18, 2F

10/10 23:18, , 3F
你的macro展開後會變成if(A && B || C)
10/10 23:18, 3F

10/10 23:19, , 4F
所以是優先權問題囉?
10/10 23:19, 4F

10/10 23:19, , 5F
&&比||先算 所以爆了
10/10 23:19, 5F

10/10 23:19, , 6F
macro function 真的是一門藝術..純c建議花點時間學..
10/10 23:19, 6F

10/10 23:20, , 7F
你macro應該要 ((...)&&(....)) 這樣才對
10/10 23:20, 7F

10/10 23:20, , 8F
是 變成 if ( (A&&B) || C ) 嗎?
10/10 23:20, 8F

10/10 23:20, , 9F
#define right(i) (2*(i)+1) 怎沒人提這個 XD
10/10 23:20, 9F

10/10 23:21, , 10F
慘耶 炸光光了XDDDD
10/10 23:21, 10F

10/10 23:24, , 11F
寫錯了#define ... ((...)||(...))
10/10 23:24, 11F

10/10 23:24, , 12F
^我自己的推
10/10 23:24, 12F

10/10 23:25, , 13F
能用inline的話就別用macro了 會少很多問題XD
10/10 23:25, 13F

10/10 23:37, , 14F
好的 感謝各位>w<我再多練練 ˋ口ˊ!!
10/10 23:37, 14F

10/10 23:39, , 15F
問題是在展開後|| 也有short circuit...
10/10 23:39, 15F

10/10 23:39, , 16F
如果A&&B 是false 反而會去做C
10/10 23:39, 16F

10/11 00:27, , 17F
小弟我看到macro沒括起來的時候反應也跟1F f大一樣XD
10/11 00:27, 17F

10/11 03:09, , 18F
macro加個括號是很重要的,請參閱《C traps and Pitfalls》
10/11 03:09, 18F
文章代碼(AID): #1EamiJbA (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EamiJbA (C_and_CPP)