user-0 提问: int i = 1；i = i ++ > 0 ? i++： i;  为什么i等于2而不是3？

回复:
user: user-0
content: 引用 30 楼 unituniverse2 的回复:[quote=引用 29 楼 unituniverse2 的回复:] 其实这问题全出在i=i++>0上 这个式子其实是 i=(i++>0) i++>0为true，所以相当于i=true 结果i=1，然后才是执行问号后面的内容 居然没看清楚。。结果作废好了 i = i ++ > 0 ? i++： i; 相当于 i = (i ++ > 0 ? i++ : i); 按标准?:的副作用在过？时就结束，结果应该为i=i++。问题是这个式子本身是未定义的（即使按最新的标准，i=++i是已定义的表达式，而后置型的i=i++则仍属于未定义的情况）。[/quote]  谢

user: user-0
content: 引用 21 楼 FancyMouse 的回复:[quote=引用 11 楼 u012526168 的回复:] [quote=引用 5 楼 FancyMouse 的回复:] [quote=引用 2 楼 u012526168 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] >这时i = 2 并作赋值给i，然后遇到序列点；i再自增 这里没有序列点 五点58，蛮拼的 分号不是序列点？[/quote] 分号是分整个statement的，不是分?:的。分号序列点发生在整个i = i++ > 0 ? i++ : i之后。[/quote] 这个我知道啊，先赋值嘛，之后不是应该还自增的[/quote] 那你就应该知道你这写法等价于i++; i=i++;而这是未定义行为。[/quote]  谢谢，有眼不识泰山，你是对的。

user: user-1
content: 初看这个标题还以为是简单问题呢，没想到这么复杂。受教了

user: user-2
content: 引用 33 楼 u012526168 的回复:[quote=引用 30 楼 unituniverse2 的回复:] [quote=引用 29 楼 unituniverse2 的回复:] 其实这问题全出在i=i++>0上 这个式子其实是 i=(i++>0) i++>0为true，所以相当于i=true 结果i=1，然后才是执行问号后面的内容 居然没看清楚。。结果作废好了 i = i ++ > 0 ? i++： i; 相当于 i = (i ++ > 0 ? i++ : i); 按标准?:的副作用在过？时就结束，结果应该为i=i++。问题是这个式子本身是未定义的（即使按最新的标准，i=++i是已定义的表达式，而后置型的i=i++则仍属于未定义的情况）。[/quote]  谢[/quote]  引用 31 楼 u012526168 的回复:[quote=引用 30 楼 unituniverse2 的回复:] [quote=引用 29 楼 unituniverse2 的回复:] 其实这问题全出在i=i++>0上 这个式子其实是 i=(i++>0) i++>0为true，所以相当于i=true 结果i=1，然后才是执行问号后面的内容 居然没看清楚。。结果作废好了 i = i ++ > 0 ? i++： i; 相当于 i = (i ++ > 0 ? i++ : i); 按标准?:的副作用在过？时就结束，结果应该为i=i++。问题是这个式子本身是未定义的（即使按最新的标准，i=++i是已定义的表达式，而后置型的i=i++则仍属于未定义的情况）。[/quote]  不懂，可不可以说的详细点[/quote]  引用 30 楼 unituniverse2 的回复:[quote=引用 29 楼 unituniverse2 的回复:] 其实这问题全出在i=i++>0上 这个式子其实是 i=(i++>0) i++>0为true，所以相当于i=true 结果i=1，然后才是执行问号后面的内容 居然没看清楚。。结果作废好了 i = i ++ > 0 ? i++： i; 相当于 i = (i ++ > 0 ? i++ : i); 按标准?:的副作用在过？时就结束，结果应该为i=i++。问题是这个式子本身是未定义的（即使按最新的标准，i=++i是已定义的表达式，而后置型的i=i++则仍属于未定义的情况）。[/quote]  引用 30 楼 unituniverse2 的回复:[quote=引用 29 楼 unituniverse2 的回复:] 其实这问题全出在i=i++>0上 这个式子其实是 i=(i++>0) i++>0为true，所以相当于i=true 结果i=1，然后才是执行问号后面的内容 居然没看清楚。。结果作废好了 i = i ++ > 0 ? i++： i; 相当于 i = (i ++ > 0 ? i++ : i); 按标准?:的副作用在过？时就结束，结果应该为i=i++。问题是这个式子本身是未定义的（即使按最新的标准，i=++i是已定义的表达式，而后置型的i=i++则仍属于未定义的情况）。[/quote] 按这样理解的话，i=i++>0?++i:i;是否就等价于i=++i 呢？

user: user-0
content: 引用 17 楼 xpdavis 的回复:i=i++?i++:i;  1 i++ ----- i=2  2 i++:i; ----- 表达式求值 结果为2  3 i++  ----- i =3  4 i=表达式赋值 i=2  看汇编确实是这么执行的，但是总感觉给我之前理解的序列点有出入， 1.为什么第二个后自增操作没有对赋值之后的 i 起作用？ 2.这与 int i = 1; if (i++ > 0){ 	i = i++; } else{ 	i = i; } 有什么不同？ 3.可否把序列点在底层的实现给梳理一下？

user: user-0
content: 引用 16 楼 u013163178 的回复:我觉得讨论这个没意思啊，谁会写可读性这么差的代码，加个括号几u不至于这样啊 嗯，我也觉得。

user: user-3
content: i=i++?i++:i;  1 i++ ----- i=2  2 i++:i; ----- 表达式求值 结果为2  3 i++  ----- i =3  4 i=表达式赋值 i=2

user: user-4
content: 我觉得讨论这个没意思啊，谁会写可读性这么差的代码，加个括号几u不至于这样啊

user: user-0
content: 引用 6 楼 xpdavis 的回复:这种问题知道它的利害关系就行了，没必要花太多时间去研究它。写程序最好要知道自己要的是什么，或者是看到代码知道它想干什么，如果这两点不能做到的话，要么面壁思过，要么把代码废了。如果我看到这样的代码，就是把它废了 理是这个理，但是不知道在程序底层干了些什么导致这样，心里难受怎么办？

user: user-0
content: 引用 7 楼 r_Jimy 的回复:从现象上看，i=i++?i++:i;这里前面的i++没起作用  i=i++>0?i+10:i+20; 这样子用DEVC++，i++有起作用，i的值是12 首先谢谢你， 其次 ”从现象上看，i=i++?i++:i;这里前面的i++没起作用，“ 从汇编代码看，你说的是错误的。 012613B4  mov         dword ptr [i],ecx    012613B7  cmp         dword ptr [ebp-0D0h],0    012613BE  jle         main+54h (012613D4h)    012613C0  mov         edx,dword ptr [i]    012613C3  mov         dword ptr [ebp-0D4h],edx    012613C9  mov         eax,dword ptr [i]    012613CC  add         eax,1    012613CF  mov         dword ptr [i],eax   最后 你举得例子，好像给我问的问题没关系。

user: user-5
content: 引用 12 楼 u012526168 的回复:[quote=引用 9 楼 yongqingling 的回复:] 第二个i++，先返回i,返回了i就不执行了（gcc），你换成++i就是3了  ++i是这样，那i++呢。[/quote]i++是2啊

user: user-0
content: 引用 9 楼 yongqingling 的回复:第二个i++，先返回i,返回了i就不执行了（gcc），你换成++i就是3了  ++i是这样，那i++呢。

user: user-0
content: 引用 5 楼 FancyMouse 的回复:[quote=引用 2 楼 u012526168 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] >这时i = 2 并作赋值给i，然后遇到序列点；i再自增 这里没有序列点 五点58，蛮拼的 分号不是序列点？[/quote] 分号是分整个statement的，不是分?:的。分号序列点发生在整个i = i++ > 0 ? i++ : i之后。[/quote] 这个我知道啊，先赋值嘛，之后不是应该还自增的

user: user-0
content: 引用 30 楼 unituniverse2 的回复:[quote=引用 29 楼 unituniverse2 的回复:] 其实这问题全出在i=i++>0上 这个式子其实是 i=(i++>0) i++>0为true，所以相当于i=true 结果i=1，然后才是执行问号后面的内容 居然没看清楚。。结果作废好了 i = i ++ > 0 ? i++： i; 相当于 i = (i ++ > 0 ? i++ : i); 按标准?:的副作用在过？时就结束，结果应该为i=i++。问题是这个式子本身是未定义的（即使按最新的标准，i=++i是已定义的表达式，而后置型的i=i++则仍属于未定义的情况）。[/quote] 不懂，可不可以说的详细点

user: user-6
content: 引用 6 楼 xpdavis 的回复:这种问题知道它的利害关系就行了，没必要花太多时间去研究它。写程序最好要知道自己要的是什么，或者是看到代码知道它想干什么，如果这两点不能做到的话，要么面壁思过，要么把代码废了。如果我看到这样的代码，就是把它废了+1

user: user-7
content: 引用 29 楼 unituniverse2 的回复:其实这问题全出在i=i++>0上 这个式子其实是 i=(i++>0) i++>0为true，所以相当于i=true 结果i=1，然后才是执行问号后面的内容 居然没看清楚。。结果作废好了 i = i ++ > 0 ? i++： i; 相当于 i = (i ++ > 0 ? i++ : i); 按标准?:的副作用在过？时就结束，结果应该为i=i++。问题是这个式子本身是未定义的（即使按最新的标准，i=++i是已定义的表达式，而后置型的i=i++则仍属于未定义的情况）。

user: user-5
content: 第二个i++，先返回i,返回了i就不执行了（gcc），你换成++i就是3了

user: user-7
content: 其实这问题全出在i=i++>0上 这个式子其实是 i=(i++>0) i++>0为true，所以相当于i=true 结果i=1，然后才是执行问号后面的内容

user: user-8
content: 引用 6 楼 xpdavis 的回复:这种问题知道它的利害关系就行了，没必要花太多时间去研究它。写程序最好要知道自己要的是什么，或者是看到代码知道它想干什么，如果这两点不能做到的话，要么面壁思过，要么把代码废了。如果我看到这样的代码，就是把它废了 灰常同意，这么奇怪的代码实在不该写出来

user: user-8
content: 从现象上看，i=i++?i++:i;这里前面的i++没起作用  i=i++>0?i+10:i+20; 这样子用DEVC++，i++有起作用，i的值是12