Re: [問題] while(*s++ = *t++ );疑問

作者: suhorng ( )   2015-06-28 17:05:32
※ 引述《BitTorrent (螳勃唬)》之銘言:
: 請問一下
: strcpy 中
: while( *s++ = *t++);
: 可以copy char arrays
: 想請問一下可是++ 優先權 不是大於*
: 所以照理講第一個不會被複製到阿?
推 LiloHuang: 優先權是指誰先做誰後做,但是該做的事情還是都會執行 06/28 12:58
這裡其實我覺得優先權不是指誰先做誰後做,而是指一個運算式該怎麼被我們解讀
(後面修文補完文章內容)
作者: suhorng ( )   2015-06-28 17:06:00
不小心按錯發文了QQ 還沒寫完, 可以麻煩板主幫刪嗎..
作者: ssdoz2sk (眷戀著提拉米蘇的風采~)   2015-06-28 18:08:00
在文章標題上按大寫E可以修改內文 標題可以用大寫T
作者: LiloHuang (十年一刻)   2015-06-28 19:14:00
我意指像是 +-*/ 運算子,我們會知道先乘除後加減對於運算子的優先權解讀,就是會有誰先做誰後做的順序我猜測原po認為優先權較大的情況,可能某運算子被忽略在 flat expression 裡 Precedence 用以定義執行順序就像 https://goo.gl/2O5Wq9 開頭提及的部分,不過我想應該有更加嚴謹的定義吧
作者: LPH66 (-6.2598534e+18f)   2015-06-28 20:11:00
你想要的「更加嚴謹的定義」很多人都回了, 就是如何解讀只是在沒有副作用的時候它就是運算順序而已這裡因為 ++ 是有副作用的運算子所以才會有這種差別
作者: suhorng ( )   2015-06-28 20:14:00
今天有事沒法回文了...明天再來修完 既然有推文了文章還是留著好了XD
作者: LiloHuang (十年一刻)   2015-06-28 20:34:00
postfix ++ operator 有 side effect 這我知道 XD我上一篇的推文,是假設原 po 已知 side effect 的情況提及運算子優先權,決定了編譯後生成的機器碼順序畢竟運算子優先權的定義,就是決定了誰該先做誰該後做事後想想,side effect 的部分才是最初原 po 要的答案但是我的疑惑是,暫時撇開 postfix ++ 的 side effect為什麼運算子優先權,suhorng 認為不是先後執行順序
作者: suhorng ( )   2015-06-28 21:20:00
有三個運算子在 "優先權 => 運算先後" 的命題下會變例外&&, ||, ? :另外 sizeof 應該也可以算是一個 operator @@
作者: LiloHuang (十年一刻)   2015-06-28 21:29:00
謝謝,這樣我懂你的意思了,的確用 "如何解讀" 較恰當sizeof 的確也是一個 operator 沒錯 XD
作者: LPH66 (-6.2598534e+18f)   2015-07-01 01:35:00
另一個語法樹結構跟運算順序是兩回事的例子 #1Deo3lyi
作者: LiloHuang (十年一刻)   2015-07-01 22:04:00
我同意是因為 && 跟 || 有 short circuit evaluation我一開始的說法並沒有考量到這些運算子,不夠嚴謹了 XD但這也隱含著特定的判斷順序,機器碼仍是有規則的執行
作者: LPH66 (-6.2598534e+18f)   2015-07-01 23:49:00
Lilo 你可以去看我貼的那篇, 那篇跟 && || 都無關純粹是這個的 side-effect 跟那個的 value computation 間誰先誰後的問題而就是這個誰先誰後的不明確導致了那種寫法在不同編譯器之間會得到不同的結果
作者: LiloHuang (十年一刻)   2015-07-02 00:03:00
我認同你的說法,你那篇的例子舉的相當恰當,謝啦 :)某些有 side effect 情況下,順序的確跟編譯器實作相關也許我太過在意的是 codegen 後的機器碼都有特定順序
作者: suhorng ( )   2015-07-02 00:17:00
偷渡 Haskell 失敗QQ (X
作者: LiloHuang (十年一刻)   2015-07-02 00:48:00
對 Haskell 不懂,用過 boost::phoenix 也能 lazy 求值我知道你要講的意思啦 :)

Links booklink

Contact Us: admin [ a t ] ucptt.com