Re: 十三誡增修--08:++i/i++和--i/i--順序影響結果

看板C_and_CPP (C/C++)作者 (..)時間8年前 (2016/06/09 22:48), 8年前編輯推噓14(14085)
留言99則, 6人參與, 最新討論串1/1
※ 引述《wtchen (沒有存在感的人)》之銘言: : 這篇有爭議,乾脆直接重寫,看大家認為如何 : (尤其希望C++的高手能補充或指正,特別是multithreading的部份) : ============================================================== : 08. ++i/i++ 和 --i/i-- 的結果跟你怎麼用有關 : ++i/i++ 和--i/i-- 的問題幾乎每個月都會出現,所以特別強調。 抱歉,覺得用推文空間有點窄,乾脆回文比較 free multithread 的狀況也是蠻多的,雖然我程式沒有你們那麼厲害 不過基本上如果兩個 thread 同時執行到這行: ++i,他的結果就像 你們講的無法預期 multihread 有可能跑在只有一個 core cpu 的狀況下,這時候兩個 thread 跑 ++i 最後就真的是 i+=2,如果是單 core 但卻 enable hyperthread 的話,這部分我有點點忘了,不過印象中依然會是 i+=2,因為物理上還是單核,這部分可以給了解詳情的人補充, hyperthread 我不會,講的不一定對 不過現在都是多核啦,所以結果是無法預期的,會講到多核跟單核 的原因是在不同的機器上確實有機會碰到一台老是會有 race conditon 另外一台老舊的機器卻沒有問題的狀況 c++ 的最新 atomic 運算表達方式標準我不確定長得如何,因為印象 中這部分在過去一直有進步,不過應該 google 是找得到才對,再來跟 使用的 compiler 以及版本也有關係,使用前需要詳閱公開說明書 anyway,如果一個變數 i 被宣告成 static 或者什麼樣的形式,使得 變數 i 有可能會讓兩個以上的 thread concurrent 去 access 時, 用 ++ 或者 -- 是不穩當的,要嘛就是 lock,要嘛就必須確定是 atomic operation 以上是個人的經驗,我不是很謹慎的人所以懶得再去翻找資料比對,所以 我相信會有高手出來指正或者補充的更多,能拋磚引玉我覺得也不錯。只 是剛好看到版主講到 multithread 就手癢癢獻醜 只不過我覺得單純 c/c++ 的討論就夠啦,又要再引進 multi-thread 的話 我覺得議題有點點大,因為這又可以再牽扯的更多更多,版主以及我看另外 一位網友講的東西就已經很 detail 也很專業,在更擴及下去個人是覺得有 些些 over,拙見拙文參考看看,如果有說錯先 say sorry,很怕被冠上誤人 子弟的罪。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.110.41 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1465483724.A.84A.html ※ 編輯: cgcheng (223.136.110.41), 06/09/2016 22:53:56

06/09 22:58, , 1F
討論這部分的時候不會討論到multi thread,因為multi th
06/09 22:58, 1F

06/09 22:58, , 2F
read本來就要自己sync
06/09 22:58, 2F

06/09 23:03, , 3F
因為C++Standard有multithread的東西,想請問Standard
06/09 23:03, 3F

06/09 23:03, , 4F
對這方面到底是如何規定的?
06/09 23:03, 4F

06/09 23:23, , 5F
因為版主問了,所以我特地稍微查了一下c++11關於多線程
06/09 23:23, 5F

06/09 23:24, , 6F
看起來是把對多線程的支援度提高,實際使用上仍然需要觀
06/09 23:24, 6F

06/09 23:26, , 7F
06/09 23:26, 7F

06/09 23:27, , 8F
感謝,因為我大部份都用C所以C++比較不熟
06/09 23:27, 8F

06/09 23:28, , 9F
既然不會影響我就放心了
06/09 23:28, 9F

06/09 23:28, , 10F
不過我剛重看了一下討論串,caesar08你有參與討論?
06/09 23:28, 10F

06/09 23:31, , 11F
wtchen看得出你很仔細謹慎,我個人是頗欣賞,我所講的只
06/09 23:31, 11F

06/09 23:32, , 12F
是提醒加上手賤,never mind
06/09 23:32, 12F

06/09 23:34, , 13F
給新手看的東西要很小心,不要造成太大的誤解讓新手一開始
06/09 23:34, 13F

06/09 23:34, , 14F
觀念錯誤,所以謹慎為上。
06/09 23:34, 14F

06/09 23:35, , 15F
嘖嘖,所以一開始我其實不是很想發文,因為要很謹慎
06/09 23:35, 15F

06/09 23:36, , 16F
討論的時候無所謂啦,板工發的置底文就另當別論了 XD
06/09 23:36, 16F

06/09 23:36, , 17F
no。我只是要說,不需要考慮到multi thread的情況
06/09 23:36, 17F

06/09 23:36, , 18F
不過那個什麼逗號是分隔號還是運算元這個新人應該看不懂
06/09 23:36, 18F

06/09 23:38, , 19F
caesar08,y..我講同件事...但總覺得感覺哪邊怪怪的
06/09 23:38, 19F

06/09 23:45, , 20F
,運算符那邊要是沒人提我也不知道 XD
06/09 23:45, 20F

06/09 23:46, , 21F
不過,分隔號不算sequence point應該是必備常識
06/09 23:46, 21F

06/09 23:48, , 22F
常識?!其實在很久前我並不知道.後來就算知道了但還真的沒
06/09 23:48, 22F

06/09 23:49, , 23F
遇到讓我有機會去管這個差別的時刻
06/09 23:49, 23F

06/09 23:52, , 24F
好比有一條好像是說不要overload逗號,實際上就是不會有
06/09 23:52, 24F

06/09 23:52, , 25F
人這樣搞
06/09 23:52, 25F

06/09 23:52, , 26F
例如F(a(&x), b(&x)),如果a跟b都會改變該引數指標指向
06/09 23:52, 26F

06/09 23:53, , 27F
的變數(x),那結果就會看a先執行還是b先執行
06/09 23:53, 27F

06/09 23:54, , 28F
當然會這樣搞的應該很少....
06/09 23:54, 28F

06/09 23:54, , 29F
oh,boost好像有這樣幹,那那那當我沒常識好了
06/09 23:54, 29F

06/09 23:56, , 30F
func裡面再有func,好像也是,勾起我一點點回憶..不過很少
06/09 23:56, 30F

06/09 23:56, , 31F
倒是真的
06/09 23:56, 31F

06/09 23:58, , 32F
因為C有aliasing,如果觀念不太對寫出的code會很奇怪
06/09 23:58, 32F

06/09 23:59, , 33F
alias是啥
06/09 23:59, 33F

06/10 00:00, , 34F
雖然可以strict aliasing,可是有些高手也會用aliasing
06/10 00:00, 34F

06/10 00:00, , 35F
做些有的沒的特技。
06/10 00:00, 35F

06/10 00:08, , 37F
原本非題所涵蓋的範圍比現在的廣很多,改這樣感覺變
06/10 00:08, 37F

06/10 00:08, , 38F
成是只針對 ++ -- 而已了…
06/10 00:08, 38F

06/10 00:08, , 39F
原本非題→原本題目
06/10 00:08, 39F
還有 21 則推文
06/10 00:31, , 61F
alaising就是一個函式兩個以上pointer參數是同一個這樣...
06/10 00:31, 61F

06/10 00:31, , 62F
所以我就想說用 在一個無順序點的表示式中...
06/10 00:31, 62F

06/10 00:31, , 63F
一般人不會這樣搞不過compiler預設就是假設真的有人這樣寫
06/10 00:31, 63F

06/10 00:32, , 64F
一是邏輯等價的,二是也許看的人會直接無視順序點XD
06/10 00:32, 64F

06/10 00:32, , 65F
parameter同個pointer?有需要這樣子用阿?
06/10 00:32, 65F

06/10 00:32, , 66F
現在大學到底教不教順序點?如果有教的話怎麼老是有++/--
06/10 00:32, 66F

06/10 00:33, , 67F
的問題出現?
06/10 00:33, 67F

06/10 00:33, , 68F
不教,因為這是實作的細節,不是程式語言理論基礎
06/10 00:33, 68F

06/10 00:34, , 69F
遇到的人,自己想辦法除錯啦,自己就會發現了吧應該
06/10 00:34, 69F

06/10 00:34, , 70F
cgcheng大不看這串OK,要回來看文發文就好....
06/10 00:34, 70F

06/10 00:35, , 71F
我怎麼覺得可以解讀為++/--學好就是一個破處的成長開始XD
06/10 00:35, 71F

06/10 00:35, , 72F
老師也會儘可能不出那種自己為是要背優先級的爛題目
06/10 00:35, 72F

06/10 00:35, , 73F
06/10 00:35, 73F

06/10 00:36, , 74F
不過因為C++的作法跟C又有不同,所以原題目不太合適
06/10 00:36, 74F

06/10 00:37, , 75F
C++可以允許 ++++i這種寫法
06/10 00:37, 75F

06/10 00:37, , 76F
有人有更好的意見歡迎提出,集思廣益!
06/10 00:37, 76F

06/10 00:38, , 77F
不然就擴展題目的範圍:不要做出語言未定義的性為?
06/10 00:38, 77F

06/10 00:38, , 78F
++++i因為可能還要考慮operator overload吧?
06/10 00:38, 78F

06/10 00:38, , 79F
                     行
06/10 00:38, 79F

06/10 00:39, , 80F
++i 在 C++ 是 lvalue 而 C 是 rvalue
06/10 00:39, 80F

06/10 00:39, , 81F
你們討論的本來就到了實作上的細節,不過實際上到底要不要
06/10 00:39, 81F

06/10 00:40, , 82F
管這些都還很難說
06/10 00:40, 82F

06/10 00:41, , 83F
不要做出語言未定義的行為->未定義行為多到數不清~~
06/10 00:41, 83F

06/10 00:41, , 84F
對啊 XDDD 沒錯啊 但是可以舉幾個常見會犯的例子
06/10 00:41, 84F

06/10 00:42, , 85F
我這個新手只會覺得哪來這麼多毛 :~~
06/10 00:42, 85F

06/10 00:42, , 86F
所以我盡可能舉例說明....但是C跟C++分歧已經越來越大
06/10 00:42, 86F

06/10 00:43, , 87F
不過這會讓它與前面的東西重疊,修改字串常量就是UB
06/10 00:43, 87F

06/10 00:43, , 88F
要兼顧其實有點複雜,加上很多老師把C++當C教
06/10 00:43, 88F

06/10 00:43, , 89F
好吧,到這很明顯crazy,只是路過,很謝謝你們陪我 XD
06/10 00:43, 89F

06/10 00:44, , 90F
C++都快出到17了還在用C的語法...
06/10 00:44, 90F

06/10 00:45, , 91F
不然就分成新手與進階兩種不同的內容(誤
06/10 00:45, 91F

06/10 00:45, , 92F
所以我才想說針對++/--就好,就如cgcheng說的,搞懂
06/10 00:45, 92F

06/10 00:45, , 93F
就很不容易了
06/10 00:45, 93F

06/10 15:28, , 94F
標題改了一下
06/10 15:28, 94F

06/10 15:28, , 95F
"++i/i++/--i/i--/f(&i)哪個先執行跟順序有關"
06/10 15:28, 95F

06/10 15:29, , 96F
不知這樣好不好?原標題因為真的不太正確所以不能用
06/10 15:29, 96F

06/10 16:33, , 97F
沒有說不好,但是實在這樣下去越來越複雜也是不妥QQ
06/10 16:33, 97F

06/10 16:50, , 98F
我是覺得正確最重要,已經儘可能簡化了
06/10 16:50, 98F
※ 編輯: cgcheng (223.136.110.41), 06/11/2016 03:26:36

06/29 16:01, , 99F
朝聖推
06/29 16:01, 99F
文章代碼(AID): #1NMO7CXA (C_and_CPP)
文章代碼(AID): #1NMO7CXA (C_and_CPP)