Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';这个表达式怎么了?b=a+;(a=a+;5)_C# - Fatal编程技术网

C# 什么';这个表达式怎么了?b=a+;(a=a+;5)

C# 什么';这个表达式怎么了?b=a+;(a=a+;5),c#,C#,结果b=15 为什么第一个“a”在此之后不发生变化(a=a+5)?但为什么第二个会改变呢?这里到底发生了什么 表达式从左到右求值-始终,无论分组如何。所以它相当于: a = 5 b = a + (a = a + 5) int x = First() + Second() * Third(); 因此,执行此操作后,a将为10。但是,只有在对主加法的第一个操作数计算了a之后,才会发生这种情况,这就是为什么结果是15而不是20 理解计算顺序与优先级不同的部分非常重要。考虑这一点: a = 5;

结果b=15


为什么第一个“a”在此之后不发生变化(a=a+5)?但为什么第二个会改变呢?这里到底发生了什么

表达式从左到右求值-始终,无论分组如何。所以它相当于:

a = 5
b = a + (a = a + 5)
int x = First() + Second() * Third();
因此,执行此操作后,
a
将为10。但是,只有在对主加法的第一个操作数计算了
a
之后,才会发生这种情况,这就是为什么结果是15而不是20

理解计算顺序与优先级不同的部分非常重要。考虑这一点:

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
优先级意味着乘法应用于调用
Second()
Third()
的结果,但是
First()
仍然首先计算。换言之,本声明等同于:

a = 5
b = a + (a = a + 5)
int x = First() + Second() * Third();
有关更多详细信息,请参阅


但是我强烈建议不要编写这样的代码。

表达式总是从左到右求值,然后分配给左手边的任何东西。 作为


不同于C和C++,子表达式的评价顺序为C左右。这就是为什么这个表达

  a = 5
  b = a + (a = a + 5)
\\b = 5 + (a = 5 + 5)
  b = 15
j= ++i + ++i ;   

在C中有明确定义的行为,而C和C++中没有定义。p> 表达

  a = 5
  b = a + (a = a + 5)
\\b = 5 + (a = 5 + 5)
  b = 15
j= ++i + ++i ;   

a
将首先求值,然后将
a+5
求值并分配给
a
,并且在两个求值子表达式相加后,
b
将具有值
15

我们总是从左到右工作,帕伦夫妇只是把总和的一部分分组。所以记住,总是从左到右。我一步一步地走到下面

从问题开始

a=5

b=a+(a=a+5)

现在将第一个“a”改为5

b=5+(a=a+5)

现在让我们在列中求和

b=5+(a=5+5)

这给了我们

b=5+10或者你可以说b=5+(a=10)

答案是

b=15

现在也是


a=10

首先计算第一个
a
。这是最重要的。表达式是从左到右解析的,所以当它第一次被访问时a是5。抛开一切,不要写这样的代码。阅读答案,澄清
b=(a=a+5)+a
@zardilior-Re我们不应该对新的编码方式持开放态度吗?不,不总是。这个问题的正确答案是不要这样做,不管怎样。C和C++有一个简单的答案:鼻腔恶魔可能会飞出你的鼻子。Haskell和其他函数语言试图得到一个更简单(但最终是错误的)答案:这是非法的。(这最终是错误的,因为存在自我参照问题。阅读格德尔、埃舍尔、巴赫:《一条永恒的金色辫子》了解细节。)像C#这样试图从中获得意义的语言只是在愚弄自己。在所有语言中,答案都是不要这样做。所以帕伦人没有得到更高的优先权,你是说?就像OP做的那样(a=a+5)。但是,我对你的答案不是很满意。当你用部分来解释时,意味着你用两个不同的语句(左和右)来计算这个表达式。所以,就你的答案而言,你是对的。但是问题的陈述是不同的&一步计算。@ArupRakshit:括号用于分组,而不是顺序。不管分组如何,表达式的LHS总是首先执行。@WaqasShabbir:不,答案的关键是我的语句与原始语句等价。它不像原始语句是在CPU中以原子方式执行的。编译器将它分解成多个步骤(甚至我的答案可以分解为额外的中间加成步骤)。@ Ergurth: C或C++中的顺序是不明确的,但这个问题不是关于那些语言的。你说,但是我不太满意你对乔恩的答案的答案。那很好,但是你的答案怎么比乔恩的更好呢?另外,第3行的内容也不清楚
b=5+(a=5+5)
至少要加上注释,这样才有意义。“但你的答案如何比Jon的答案更好?”-这是一个无关紧要的问题。从来都不是@SriramSakthivel,是的,你是对的。我对此发表评论。我只解释了表达式总是从左到右求值。结果被赋值给赋值语句左侧的操作数。您的代码示例解释得不太清楚。这意味着它同时在表达式的两个部分中替换a的值,而不是。在这种情况下,这并不重要,但可能会导致人们错误地应用相同的逻辑,在一个步骤中获得
b=(a=a+5)+a
导致
b=(a=5+5)+5
,这是错误的。你需要证明它首先完全评估LHS,然后开始评估右手侧,例如将
b=5+(a=a+5)
作为中间步骤之一。我完全同意@Chris。我还要添加
b=5+(a=10)
b=5+10//a现在是10
,作为额外的中间步骤。我提到的最后一个步骤还将清楚地指出a的值实际发生变化的时间(您可能可以在之前的步骤中添加“a仍然是5”,或者在该步骤中添加“a到现在是5”,以使此变化更加清楚)。在第一个示例中,加法方程的两边都是相同的,因此即使解析为RTL,答案应该是一样的。@BrianHannay;C标准规定:如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值进行的值计算不排序,则该行为是未定义的。这使得第一个语句处于未定义的行为之下。而第二条语句调用UB,因为C标准说:如果