C#:功能评估顺序(vs C)

And*_*ech 7 c c# math

请使用以下C代码(K&R第77页):

push(pop() - pop()); /* WRONG */
Run Code Online (Sandbox Code Playgroud)

书中说,自从-/是不可交换的运营商,其中2个顺序pop功能进行评估是必要的(显然,以获得正确的结果)......这样的话你必须首先把第一函数的结果的变量然后继续算术,如下:

op2 = pop();
push(op2 - pop());
Run Code Online (Sandbox Code Playgroud)

显然这是因为编译器无法保证评估函数的顺序(...为什么?)


我的问题是,C#做同样的事吗?在使用C#时,我是否需要担心这种事情?就此而言,任何其他更高级别的语言?

Mic*_*hue 11

在C#中它是从左到右:http://blogs.msdn.com/oldnewthing/archive/2007/08/14/4374222.aspx


Re:C++订单

显然这是因为编译器无法保证评估函数的顺序(...为什么?)

任何特定的编译器都可以保证订单.问题是语言规范没有指定顺序,所以每个编译器都可以做任何想做的事情.这意味着如果要保证排序,则必须在两个方法调用之间添加一个序列点.


Mic*_*urr 5

回答你关于为什么C没有定义操作顺序的问题,这只是因为C的发明者认为给编译器实现者提供优化表达式评估的机会是有价值的.他们还认为这比给予程序员表达评估的确定性更有价值.

请记住,当C最初开发时,机器的能力远远低于今天,并且更有兴趣为编译器提供优化余地.今天,通常会给予更安全,更可预测的代码更多的权重.

  • 随着性能与可预测性之间的重要性的转移(这与主要成本从计算机运营成本向程序员工资的转移有很大关系),人们还指出,已经允许因为它产生了有意义的差异的情况,因为编译器可以很容易地证明没有行为差异. (2认同)