[問題] 請問關於a=a++的問題

看板C_and_CPP作者 (阿湯)時間7年前 (2016/11/03 17:06), 編輯推噓14(14051)
留言65則, 21人參與, 最新討論串1/2 (看更多)
抱歉!想請問各位高手一個基本的問題.. 我測試一個小小的程式碼的時候 其中 int a=0; a=a++; printf("%d",a); 結果是0 為什麼不是1 我的想法如下: 1.先做a=a,此時a=0 2.再執行a=a+1,此時a=1 但結果卻是0,和想的不同 請問各位大大,是甚麼原因呢? 感激不盡.... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.232.225.26 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1478163995.A.EAA.html

11/03 17:16, , 1F
undefined behavior
11/03 17:16, 1F

11/03 17:17, , 2F
置底13誡 no.8
11/03 17:17, 2F

11/03 17:17, , 3F
先知道a++跟++a的差別吧
11/03 17:17, 3F

11/03 17:19, , 4F
a++是在整行程式結束(分號後)才做+1的動作,另外反之
11/03 17:19, 4F

11/03 17:22, , 5F
抱歉,第一次發文
11/03 17:22, 5F

11/03 17:23, , 6F
開發平台(Platform): (Ex: Win10, Linux, ...) Win10
11/03 17:23, 6F

11/03 17:23, , 7F
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台
11/03 17:23, 7F

11/03 17:26, , 8F
不同的話需列出) DEVC++
11/03 17:26, 8F

11/03 17:27, , 9F
置底13誡 no.8 哪裡看不懂?
11/03 17:27, 9F

11/03 17:27, , 10F
我知道a++和++a的區別,但是這個真的不一樣
11/03 17:27, 10F

11/03 17:30, , 11F
誰寫這種東西先把他開除掉
11/03 17:30, 11F

11/03 17:30, , 12F
我這個和置底13誡 no.8 的不同
11/03 17:30, 12F

11/03 17:32, , 13F
不是針對你,誰寫這種東西明天就不用來上班了+1
11/03 17:32, 13F

11/03 17:34, , 14F
這是 undefined behavior,你不能自己一廂情願
11/03 17:34, 14F

11/03 17:35, , 15F
a++ 回傳 a 是沒錯,但assign和increase不見得誰先做
11/03 17:35, 15F

11/03 17:37, , 16F
這就是第八誡要告訴我們的事,唐僧就是要他徒弟記住這點
11/03 17:37, 16F

11/03 17:37, , 17F
抱歉!我致底13誡.no8有的地方沒看到
11/03 17:37, 17F

11/03 17:38, , 18F
不過我覺得很奇怪,因為編譯可以過
11/03 17:38, 18F

11/03 17:38, , 19F
而且我看過以下的文章
11/03 17:38, 19F

11/03 17:38, , 20F

11/03 17:39, , 21F
抱歉!我囉嗦了點...但我還是覺得很奇怪
11/03 17:39, 21F

11/03 17:39, , 22F
這文好屌 已跪
11/03 17:39, 22F

11/03 17:41, , 23F
原po可以先google什麼是undefined behavior
11/03 17:41, 23F

11/03 17:47, , 24F
a += 1
11/03 17:47, 24F

11/03 17:47, , 25F
置底第8誡有跟你說編譯會不過嗎?XD
11/03 17:47, 25F

11/03 17:48, , 26F
我上網查了undefined behavior,了解了..
11/03 17:48, 26F

11/03 17:48, , 27F
感謝各位..
11/03 17:48, 27F

11/03 17:52, , 28F
我剛剛試了一下,gcc (Dev C++) 加 -Wall 會有 warning
11/03 17:52, 28F

11/03 18:33, , 29F
這問題跟雞生蛋還是蛋生雞一樣
11/03 18:33, 29F

11/03 18:35, , 30F
就算有置底這個問題還是常常冒出來...以後是不是每本
11/03 18:35, 30F

11/03 18:36, , 31F
教科書或程式課一開始就先教這個算了
11/03 18:36, 31F

11/03 18:37, , 32F
或者考慮一下把它常駐板標呢XDD
11/03 18:37, 32F

11/03 19:24, , 33F
大學有在教undefined behavior嗎?
11/03 19:24, 33F

11/03 19:40, , 34F
記得我們系的大一計程有教
11/03 19:40, 34F

11/03 19:52, , 35F
我想把13誡加個第0誡講undefined behavior好了
11/03 19:52, 35F

11/03 19:54, , 36F
我大一的時候沒有教
11/03 19:54, 36F

11/03 20:45, , 37F
可以嘗試a=(a++),不過仍是不建議的寫法。
11/03 20:45, 37F

11/03 21:04, , 38F
或是你可以使用C++17的compiler..
11/03 21:04, 38F

11/03 22:01, , 39F
我大學沒教undefined behavior
11/03 22:01, 39F

11/03 22:02, , 40F
感謝各位...長了許多知識
11/03 22:02, 40F

11/03 23:21, , 41F
這個問題真的是蠻常出現的,大概一個月一次 Orz
11/03 23:21, 41F

11/03 23:21, , 42F
不過我也是來這個版之後才知道的 Orz
11/03 23:21, 42F

11/04 00:15, , 43F
不是一句大學沒教的問題...
11/04 00:15, 43F

11/04 00:28, , 44F
我那句是在回答wtchen的提問啦...
11/04 00:28, 44F

11/04 01:35, , 45F
解釋一下,明天不用來上班的原因是這種 bug 極度難抓
11/04 01:35, 45F

11/04 01:36, , 46F
所以大家都已經訓練有素,看見類似的寫法立刻窮追猛打
11/04 01:36, 46F

11/04 01:37, , 47F
code review 時看見,不管執行結果對不對先開罵再講
11/04 01:37, 47F

11/04 01:38, , 48F
因為就算目前執行結果是對的,不立刻改正以後可能會出錯
11/04 01:38, 48F

11/04 01:41, , 49F
前面有人說在分號後才做,其實在複雜算式裡不一定是這樣
11/04 01:41, 49F

11/04 01:42, , 50F
而且複雜算式的未定義行為可能 compiler 也抓不出來
11/04 01:42, 50F

11/04 02:34, , 51F
根本就沒差那一行 有什麼必要寫這樣?
11/04 02:34, 51F

11/04 22:32, , 52F
我也習慣寫成a+=1,比較能預知行為
11/04 22:32, 52F

11/05 08:42, , 53F
開除+1 不要說不懂未定義 連++功能都不清楚是哪招
11/05 08:42, 53F

11/05 16:50, , 54F
就算有括號起來應該也還是UB? 不是很確定XD
11/05 16:50, 54F

11/05 16:54, , 55F
@michael0728n 括起來一樣是 undefined behavior 無誤
11/05 16:54, 55F

11/05 17:01, , 56F
在C++, a = ++a OK, a=a++不行 (左值跟右值的問題)
11/05 17:01, 56F

11/05 17:01, , 57F
不過就算是C+我還是不希望看到這種code....
11/05 17:01, 57F

11/05 18:14, , 58F
偷問一下,樓上的前者為何可以?因為++a會產生斷點嗎
11/05 18:14, 58F

11/05 18:15, , 59F
*sequence point
11/05 18:15, 59F

11/05 18:38, , 60F
請看置底13誡-8,不過印象中C++11開始才能這麼搞
11/05 18:38, 60F

11/05 18:40, , 61F
有人要總結一下C++14/17針對這方面的修改嗎?
11/05 18:40, 61F

11/06 09:21, , 62F
懂了,概念停在C++03,難怪看置底感覺怪怪
11/06 09:21, 62F

11/06 09:22, , 63F
置底好像改好了,謝謝版主~
11/06 09:22, 63F

11/06 17:17, , 64F
因為板工很少用C++,愈來愈複雜 @@
11/06 17:17, 64F

11/06 19:23, , 65F
感覺需要拆板了~
11/06 19:23, 65F
文章代碼(AID): #1O6luRwg (C_and_CPP)
文章代碼(AID): #1O6luRwg (C_and_CPP)