a = 5
b = a + (a = a + 5)
Run Code Online (Sandbox Code Playgroud)
结果b = 15
为什么第一个'a'在那之后没有变化(a = a + 5)?但为什么第二个改变?这步骤究竟发生了什么?
Jon*_*eet 161
表达式从左到右进行评估 - 始终,无论分组如何.所以它相当于:
a = 5;
int lhs = a; // 5
int rhs = (a = a + 5); // Increments a by 5 (i.e. a=10), and rhs=10
b = lhs + rhs; // 15
Run Code Online (Sandbox Code Playgroud)
所以在执行完之后,a
将会是10.但是这只发生在a
主要加法的第一个操作数被评估之后,这就是为什么结果是15而不是20.
理解评估顺序与优先级不同的部分非常重要.考虑一下:
int x = First() + Second() * Third();
Run Code Online (Sandbox Code Playgroud)
优先级意味着乘法适用于调用的结果Second()
和Third()
- 但First()
仍然首先进行求值.换句话说,这个陈述相当于:
int lhs = First();
int rhs = Second() * Third();
int x = lhs + rhs;
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅Eric Lippert关于预定,关联性和排序的博客文章.
我强烈建议不要写这样的代码.
hac*_*cks 18
与C和C++不同,子表达式的评估顺序在C#中是从左到右.这就是表达的原因
j= ++i + ++i ;
Run Code Online (Sandbox Code Playgroud)
在C#中有明确定义的行为,而在C和C++中未定义.
在表达中
b = a + (a = a + 5)
Run Code Online (Sandbox Code Playgroud)
left a
将首先进行评估,然后a+5
进行评估,a
并在添加两个评估的子表达式之后分配,b
将具有值15
.
Waq*_*bir 10
表达式始终从左到右进行评估,然后分配给左手边的任何内容.如
a = 5
b = a + (a = a + 5)
\\b = 5 + (a = 5 + 5)
b = 15
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10499 次 |
最近记录: |