这是一个基本的理解问题。
我尝试对一些代码进行重新排序,尽管据说这些操作是等效的,但我得到了不同的值。 我从这行开始:
q, r, m = 10*q, 10*(r-m*t), (10*(3*q+r))//t - 10*m
并将其更改为:
q*=10; r=10*(r-m*t); m= (10*(3*q+r))//t - 10*m;
(初始值为q = 1,r = 6,t = 3,m = 3)。
当我仅运行第二行时,m获得值-30(如果我正确遵循操作顺序,这是准确的),而运行第一行时则得到m = 0,这是程序所要求的。 / p>
我在这里想念什么?在所有其他分配完成之后,逗号方法是否分配值?
答案 0 :(得分:1)
q, r, m = 10*q, 10*(r-m*t), (10*(3*q+r))//t - 10*m
中的赋值是通过评估所有赋值的右侧独立完成的,而没有任何人影响其他赋值,这意味着在评估(10*(3*q+r))//t - 10*m
时,q
的旧值被使用,而不是新的10*q
(与r
相同)。请注意,唯一的区别在于m
的值,这取决于r
和q
的值,在分配m
时它们不变。 / p>
答案 1 :(得分:0)
问题在于,在将结果分配给q
,r
和m
变量之前,您的第一个代码段会评估右侧的每个表达式。相反,您的第二个片段分配:
q*=10
r=10*(r-m*t)
-评估之前:
m= (10*(3*q+r))//t - 10*m
将更改结果。如果必须使用后一个代码段,则需要引入一个临时变量来存储原始的q
和r
变量值,以便在最终表达式中使用。
实际上,由于q
不依赖于其他任何一个变量,因此实际上您可以最后分配其值,将其他两个变量保留在范围内,以略微简化表达式:
r, m = 10*(r-m*t), (10*(3*q+r))//t - 10*m
q *= 10
答案 2 :(得分:0)
在第一种情况下,所有赋值都使用变量之前的值。
在第二种情况下,您要先更改一些变量(以后的分配将使用变量的新值)。
比较a, b = b, a
与a = b; b = a
。第一个将交换值,第二个将不交换值。