Re: [問題] 13誡之八的疑惑

作者: saladim (殺拉頂)   2014-06-05 06:24:18
※ 引述《RealJack ()》之銘言:
: ※ 引述《saladim (殺拉頂)》之銘言:
: : 小弟對於13誡之八有點疑惑, 主要在第二個敘述, 以下引述第八誡:
: : ===========
: : 你不可以在一個運算式(expression)中,對一個基本型態的變數修改其值
: : 超過一次以上。否則,將導致未定義的行為(undefined behavior)
: (++i)+(i++)
: 敘述一是說不可以在一條運算式中對某個變數在不同的地方改變值
: : 你也不可以在一個運算式(expression)中,對一個基本型態的變數修改其值,
: : 而且還在同一個式子的其他地方為了其他目的而存取該變數的值。(其他目的
: : 是指不是為了計算這個變數的新值的目的)。否則,將導致未定義的行為。
: 敘述二是說不可以在一條運算式中的一個地方對某個變數改變值,
: 又在"同一條運算式的另一個地方"讀取此變數的值
: int i=0;
: cout<<i<<" "<<++i<<endl; //未定義,取自C++ primer 5th 簡中版P.123
: 先求++i=> 輸出1 1
: 先求 i=> 輸出0 1
: 敘述一,二會出問題都是因為求值順序未定義
謝謝 這個例子替我解答了部分疑惑 這樣的一個statement的確不是純粹是計算值而已
其實另一個疑惑是 此敘述說不可以因為目的AA(用符號代表) 而在同一個expr
內修改值後再去存取該變數 那我就想問: 那若不是因為AA呢? 若是因為AA就
可以再次存取嗎?
不是目的AA : 為了計算這個變數的新值的目的 或是 其他
作者: putumaxally (putumaxally)   2014-06-05 10:50:00
++i; 或 i++; 都自己一行的話,應該就不用管第八戒了我寫兩個後置 ++ 你寫成一個前置 ++
作者: RealJack   2014-06-05 14:16:00
不可以因為AA而... 這句話等同: 因為AA而...是被禁止的若是因為AA而...是不行的,標上紅色和綠色的句子是同件事誡8可以簡單說: ++a,a++出現過,表達式就'不該'出現a像是邏輯&&和邏輯||可以出現a++兩次=> if(a++ && ++a)因為求值順序被規定要"先"算左"再"算右
作者: diabloevagto (wi)   2014-06-05 22:57:00
邏輯判斷要小心 Short-Circuit Evaluation
作者: LPH66 (-6.2598534e+18f)   2014-06-06 02:52:00
RJ 講的正是因為短路的關係所以必須先算左完才能算右不過這就代表右邊的計算可能不會進行
作者: saladim (殺拉頂)   2014-06-07 07:51:00
R大 八誡精神我大概理解 只是這邊文字上令人困惑然後我有些錯誤 已改 在綠色句子那邊修正過後 如果沒再次犯錯的話 才是想要表達的 但這跟R大大的解釋文(R大推文的第一,二行)又不太一致
作者: RealJack   2014-06-07 12:05:00
綠色那段文字 = 誡八敘述一,所以不能再次存取變數能否用一個例子指出矛盾點,這樣比較能釐清問題
作者: saladim (殺拉頂)   2014-06-08 20:16:00
R大 就是想不出矛盾例子~ 怎麼說勒 這邊我疑惑之處就是:如果不能因為AA作動作BB 那因為AA可以作動作BB嗎?
作者: RealJack   2014-06-08 21:21:00
文字對照到符號上需要細心檢查,假設AA=下雨,BB=曠課第一句:不能因為下雨而曠課,第二句:因為下雨可曠課嗎?事實上面兩句子是同一句而綠色那句:那若不是因為下雨呢? 是講晴天可不可以曠課
作者: saladim (殺拉頂)   2014-06-08 21:25:00
用r大的例子 第二句就是: 那因為下雨而外的原因可曠課
作者: RealJack   2014-06-08 21:26:00
其實綠色是講誡8第一條,所以也是不行的這個語句我反覆確認過,相信是沒有問題的,這敘述方式和
作者: saladim (殺拉頂)   2014-06-08 21:40:00
所以我是被疑惑了 既然除了少數情況 則修改後讀取跟再修改皆不允許 那寫成第二敘述那種形式 會使人想說難道有其他
作者: RealJack   2014-06-08 21:41:00
這個聯結有一點像(但不是喔) http://ppt.cc/@-,E
作者: saladim (殺拉頂)   2014-06-08 21:41:00
形式可以作修改後再讀取/修改...所以 我想第一敘述跟第二敘述只是分別對再修改跟再讀取分別說明 對媽? XDDDDDDDDDD
作者: RealJack   2014-06-08 21:47:00
是的,(先修改再修改)(先修改再讀取)(先讀取再修改)都不行

Links booklink

Contact Us: admin [ a t ] ucptt.com