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
这个联结有一点像(但不是喔) @-,E" target="_blank" rel="nofollow">
@-,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