最新评论
Re:++运算符在C/C++与C#/JAVA中的差异 嗷嗷 2011-06-07 14:37
随便插一句,在蛋疼的C++0x标准中。
i = ++i;是well defined
i = i++是undefined
在C++2003里面。
i = ++i 和
i = i++
都是undefined
Re:++运算符在C/C++与C#/JAVA中的差异 阿非 2011-06-07 10:25
@键盘农夫
i=i++ 应该算 Accessing a volatile object
这句我说错了,之前没有理解volatile object,谢谢指正。
Side effects occur whenever the value of a variable is changed by an expression evaluation.
准确的说法是:
if expressions contain embedded assignments, increment operators, decrement operators, and method invocations.
so evaluation of an expression can produce side effects.
Re:++运算符在C/C++与C#/JAVA中的差异 键盘农夫 2011-06-07 07:04
@阿非
volatile object 是指
volatile int i ; 中 i 这样的数据对象
如果 i = i++ 中的 i 是 volatile 的话,那么 i = i++ 就更不具备确定性了
“在两个Sequence Point之间,同一个变量的值最多只允许被改变一次”,这个是对的
(抱歉,昨天没注意到你后来的回复)
Re:++运算符在C/C++与C#/JAVA中的差异 阿非 2011-06-07 00:50
@键盘农夫
先睡了,晚安~
Re:++运算符在C/C++与C#/JAVA中的差异 阿非 2011-06-07 00:49
@键盘农夫
Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects.
i=i++ 应该算 Accessing a volatile object
你举的例子是 modifying an object
如果你觉得我说的不是很准确的话,那我换个说法“在两个Sequence Point之间,同一个变量的值最多只允许被改变一次”否则会产生side effect 从而导致结果是Undefined,因为编译器有权决定各个Side Effect的执行顺序。
Re:++运算符在C/C++与C#/JAVA中的差异 键盘农夫 2011-06-07 00:25
@阿非
side effect不是那个意思
i = 1 也有side effect
Re:++运算符在C/C++与C#/JAVA中的差异 阿非 2011-06-07 00:17
之前我倒是知道在C/C++标准中规定了 && || , ?: 这四个运算符操作数的运算顺序,不知道这属于Sequence Points范畴的,谢谢指点。
而i=i++;则会导致 side effect,在gcc中开启 -Wsequence-point 选项可检查此类代码并给出警告。其实我倒不是想谈论什么undefined,因为这没意义。只是同样的代码在不同的语言编译器中的表现不一样,为了弄清楚原因而已。
Re:++运算符在C/C++与C#/JAVA中的差异 键盘农夫 2011-06-06 22:20
@阿非
我的看法是对这种东西“止于不写”:未定义行为不可以出现在代码中。
后面考察汇编我不赞成,那没意义
“出于灵活性考虑”是一个方面,另一方面也是为了避免不必要、基本没有实用价值的繁琐的语言规定
实际上C和C++中有一个sequence point的概念,MSDN中恐怕应该有
离开了这个概念讨论 i = i++ 是讨论不清楚的
Re:++运算符在C/C++与C#/JAVA中的差异 阿非 2011-06-06 20:37
@键盘农夫
是的,我在文中已说明这属于C/C++编译器undefined的范畴,并且标红说明千万不要在C/C++程序中依赖求值顺序,否则会死的很惨。
我了解到原因是C/C++编译器出于灵活性考虑将此划为undefined的范畴,如你有更合理解释,愿闻其详。
Re:++运算符在C/C++与C#/JAVA中的差异 键盘农夫 2011-06-06 19:46
[quote]egmkang:
[quote]键盘农夫:
在C和C++中
i = i++
是错误的写法
其行为是undefined
undefined的东西是无法讨论的[/quote]
所以他们才讨论未定义行为,因为怎么说都是对的[/quote]
同样也可以说
怎么说都是错的
Re:++运算符在C/C++与C#/JAVA中的差异 egmkang 2011-06-06 17:47
[quote]键盘农夫:
在C和C++中
i = i++
是错误的写法
其行为是undefined
undefined的东西是无法讨论的[/quote]
所以他们才讨论未定义行为,因为怎么说都是对的
Re:++运算符在C/C++与C#/JAVA中的差异 Martin Mar 2011-06-06 17:46
搞那么多汇编的东西,大部分人都看不懂吧?
Re:++运算符在C/C++与C#/JAVA中的差异 键盘农夫 2011-06-06 17:22
在C和C++中
i = i++
是错误的写法
其行为是undefined
undefined的东西是无法讨论的
Re:++运算符在C/C++与C#/JAVA中的差异 随风浪迹天涯 2011-06-06 17:06
这种题目最无聊~
y一点科技含量都没有~
Re:++运算符在C/C++与C#/JAVA中的差异 zsea 2011-06-06 14:14
^_^
