[問題] if 內 "=" 的問題

看板C_and_CPP作者 (張咩咩)時間11年前 (2014/02/27 20:42), 編輯推噓16(16042)
留言58則, 30人參與, 最新討論串1/1
各位前輩好,小弟昨日面試時碰到了個問題不了解為什麼,煩請各位前輩指點迷津了。 題目: int x=0; if(x=0 || x==0){ printf("%d\n",x); } printf("%d\n",x); 請問上面的結果為何? 小弟寫 0 ,0。 但是覺得怪怪的因此使用了dev c++(在windows)與gcc(在red hat linux)去跑, 得到的答案都是 1 ,1。 不太懂為甚麼 if中x=0再加上 || x==0後,x就變成1了。 若只跑 if(x=0),則結果會符合小弟所認知的答案,只印出一個0。用if(x==0)則答案 會是0 ,0。 以上問題,還請各位前輩協助了,感謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 119.14.49.202 ※ 編輯: nanosheep 來自: 119.14.49.202 (02/27 20:43)

02/27 20:43, , 1F
x = (0 || x == 0)
02/27 20:43, 1F

02/27 20:49, , 2F
前輩,不好意思,小弟資值駑鈍不太懂為何x=(0||x==0)
02/27 20:49, 2F

02/27 20:50, , 3F
這樣以後x就會變1,試著直接printf("%d",x=(0||x==0) );
02/27 20:50, 3F

02/27 20:50, , 4F
結果仍是0,但用再if內就變1了。還望前輩解答,感謝。
02/27 20:50, 4F

02/27 21:05, , 5F
因為運算子優先權的關係
02/27 21:05, 5F

02/27 21:06, , 6F
你確定那個print出來是0 …?
02/27 21:06, 6F

02/27 21:06, , 7F
||比=還優先被執行--> x==0會是true, 0 || true還是true
02/27 21:06, 7F

02/27 21:07, , 8F
然後true就被assign回去了
02/27 21:07, 8F

02/27 21:08, , 9F
printf("%d",x=(0||x==0) ) <== 這結果是0不是你有問題
02/27 21:08, 9F

02/27 21:09, , 10F
不然就是你電腦出事了
02/27 21:09, 10F

02/27 21:17, , 11F
考這種題目的公司實在無言…
02/27 21:17, 11F

02/27 21:28, , 12F
為何無言 挺有趣的
02/27 21:28, 12F
感謝各位前輩的解答,小弟懂了。學藝不精忽略了"="與"||"的優先權關係... 然後剛剛printf("%d\n",x=(0||x==0)); 得到0是因為小弟把它寫再原題目後面,所以 x=1再去跑printf("%d\n",x=(0||x==0)); 時就得到0了。這點小弟忽略的抱歉。 再次感謝各位前輩的指點。 ※ 編輯: nanosheep 來自: 119.14.49.202 (02/27 21:35)

02/27 22:13, , 13F
有趣+1 這是真實世界可能會遇到的
02/27 22:13, 13F

02/27 22:27, , 14F
真難
02/27 22:27, 14F

02/27 23:12, , 15F
要避免這個問題,就兩條路,把運算子優先權背熟,或者不要
02/27 23:12, 15F

02/27 23:13, , 16F
這樣寫,賦值就只做賦值,我比較偏好後者,因為優先權很容
02/27 23:13, 16F

02/27 23:14, , 17F
易背過又忘,就一般記性的人來說,應該不太實用
02/27 23:14, 17F

02/27 23:36, , 18F
盡量不要這樣寫才是正解,如果真的要這樣請愛用括號
02/27 23:36, 18F

02/28 00:19, , 19F
這空白下的太巧妙了 不知情的人還以為 || 會最後做咧
02/28 00:19, 19F

02/28 00:20, , 20F
應該寫x = 0||x==0 我猜是該公司有出過這種BUG...XD
02/28 00:20, 20F

02/28 00:23, , 21F
小弟想一般人應該也不會這樣寫。公司應該是要考基本觀念
02/28 00:23, 21F

02/28 00:24, , 22F
夠不夠扎實以及夠不夠細心吧。能多個經驗也是不錯的~
02/28 00:24, 22F

02/28 01:11, , 23F
怕手殘就寫 0==x
02/28 01:11, 23F

02/28 08:04, , 24F
考這個真的很妙…因為一般人沒事不會背這個
02/28 08:04, 24F

02/28 11:29, , 25F
考這有意義嗎
02/28 11:29, 25F

02/28 11:45, , 26F
其實還是有意義, 你自己不這樣寫但是別人可能會
02/28 11:45, 26F

02/28 11:46, , 27F
即使不記得運算優先權至少看到時要能注意到可能有問題
02/28 11:46, 27F

02/28 11:48, , 28F
超難 整人專家
02/28 11:48, 28F

02/28 11:50, , 29F
要看得出來這是容易出問題的code 別人寫要去拍他桌
02/28 11:50, 29F

02/28 11:52, , 30F
這主要是測驗你debug的經驗和能力吧
02/28 11:52, 30F

02/28 11:52, , 31F
但我覺得可以不需要 因為大部分人都知道
02/28 11:52, 31F

02/28 11:53, , 32F
寫在if()裡的= 十個有九個是bug
02/28 11:53, 32F

02/28 11:53, , 33F
就算沒有熟記運算子優先次序也可以debugy
02/28 11:53, 33F

02/28 13:01, , 34F
這題能寫對了人~就蠻有sense的 XD
02/28 13:01, 34F

02/28 14:23, , 35F
一般人寧可多用()不用去記那些順序
02/28 14:23, 35F

02/28 16:00, , 36F
所以if(auto* dog = dynamic_cast…也是bug囉?
02/28 16:00, 36F

02/28 16:07, , 37F
文中的case我都用<functional>裡的functor所以少遇
02/28 16:07, 37F

02/28 16:08, , 38F
運算要不就是極其簡單,要不就是需要函式封裝, 寫一
02/28 16:08, 38F

02/28 16:09, , 39F
團鬼才看得懂
02/28 16:09, 39F

02/28 16:48, , 40F
人不用去吃大便來證明腸胃好
02/28 16:48, 40F

02/28 20:00, , 41F
可以直接拿紅筆畫掉這幾行程式嗎?
02/28 20:00, 41F

02/28 23:02, , 42F
if (auto* dog...)這種如果有pattern matching的話就不需
02/28 23:02, 42F

02/28 23:02, , 43F
要了...可惜沒有pattern matching
02/28 23:02, 43F

03/01 09:45, , 44F
考這種的確整人= =
03/01 09:45, 44F

03/01 21:15, , 45F
等等 bool轉int時true變成1有寫在spec裡嗎??
03/01 21:15, 45F

03/01 21:16, , 46F
查了一下還真的有
03/01 21:16, 46F

03/02 00:52, , 47F
考這種東西蠻無聊的, precedence查表就好了,誰會出背@@
03/02 00:52, 47F

03/02 00:53, , 48F
市面上寫軟體的99%不會這樣寫,一點都不實用
03/02 00:53, 48F

03/02 04:20, , 49F
這應該是考腦袋是否清楚,最近似乎是研究所招生入學
03/02 04:20, 49F

03/02 04:22, , 50F
公司考這是單純為了刷人吧?
03/02 04:22, 50F

03/03 11:39, , 51F
if裡面不是bug的=超常見的吧
03/03 11:39, 51F

03/04 00:02, , 52F
我是覺得大家都用括號括起來就沒事了。除非你保證永遠只
03/04 00:02, 52F

03/04 00:02, , 53F
有你一個人維護這code
03/04 00:02, 53F

03/05 00:01, , 54F
如果if 裡的=常見 那B晶片廠太無聊 if內常數一律放左邊
03/05 00:01, 54F

03/05 00:04, , 55F
goto fail; 那份程式裡面就一堆 '=' (?)
03/05 00:04, 55F

03/05 13:15, , 56F
if裡面還有assignment應該要塊陶啊
03/05 13:15, 56F

03/05 13:47, , 57F
if(auto x=getOptionalRetVal())這種還滿正常的吧
03/05 13:47, 57F

03/05 14:33, , 58F
if (err = openConnection()) return err; 這樣也超正常
03/05 14:33, 58F
文章代碼(AID): #1J3pAwJd (C_and_CPP)