C# Ruby整数赋值-使Ruby赋值适应C类型语言
全部, 我正在尝试修改一些Ruby代码以在C中工作,但C并没有提供与Ruby相同的可用赋值语法 下面是我正在尝试修改的一些Ruby代码:C# Ruby整数赋值-使Ruby赋值适应C类型语言,c#,ruby,int,C#,Ruby,Int,全部, 我正在尝试修改一些Ruby代码以在C中工作,但C并没有提供与Ruby相同的可用赋值语法 下面是我正在尝试修改的一些Ruby代码: x, x1 = x1, x-q*x1 y, y1 = y1, y-q*y1 a, b = b, a-q*b 所以,我拿了它,做了这个,但我得到的结果与上面不同: x = x1 x1 = x-q*x1 y = y1 y1 = y-q*y1 a = b b = a-q*b Ruby是
x, x1 = x1, x-q*x1
y, y1 = y1, y-q*y1
a, b = b, a-q*b
所以,我拿了它,做了这个,但我得到的结果与上面不同:
x = x1
x1 = x-q*x1
y = y1
y1 = y-q*y1
a = b
b = a-q*b
Ruby是如何评估作业的?为什么当我把多个赋值转换成单数赋值时,结果是不同的?行
x,x1=x1,x-q*x1
意味着x和x1基本上会同时被赋值,但是你的C变量没有考虑到这一点。在c#中,代码x将在x1之前分配,因此x1将被分配x1-q*x1
,而不是x-q*x1
,因为此时x已经被分配给x1
一种可能的通用C#解决方案是
tempX = x1
tempX1 = x-q*x1
x = tempX
x1 = tempX1
行
x,x1=x1,x-q*x1
意味着x和x1基本上会同时被赋值,但是您的C#变体没有考虑到这一点。在c#中,代码x将在x1之前分配,因此x1将被分配x1-q*x1
,而不是x-q*x1
,因为此时x已经被分配给x1
一种可能的通用C#解决方案是
tempX = x1
tempX1 = x-q*x1
x = tempX
x1 = tempX1
Ruby在重新分配变量之前先计算赋值的右侧。为了使这一点更加明确,它采取了如下措施:
new_x, new_x1 = old_x1, old_x-q*old_x1
这导致:
new_x = old_x1
new_x1 = old_x-q*old_x1
但你所做的是:
new_x = old_x1
new_x1 = new_x-q*old_x1 (= old_x1 - q * old_x1 = (1 - q) * old_x1)
因此,结果是不同的。Ruby在重新分配变量之前先计算赋值的右侧。为了使这一点更加明确,它采取了如下措施:
new_x, new_x1 = old_x1, old_x-q*old_x1
这导致:
new_x = old_x1
new_x1 = old_x-q*old_x1
但你所做的是:
new_x = old_x1
new_x1 = new_x-q*old_x1 (= old_x1 - q * old_x1 = (1 - q) * old_x1)
因此结果是不同的。Ruby首先计算RHS上的每个表达式,然后将它们分配给代表性的LHS变量 下面(基本上)是Ruby如何计算第三行
a,b=b,a-q*b
:
temp1 = b
temp2 = a-q*b
a = temp1
b = temp2
具有a=5
、b=7
和q=10
的示例:
a, b = (7), (5 - 10*7)
屈服
a == 7
b == -65
如您所见,在对使用该值的RHS表达式求值之前,不会从其初始值更改任何值a
或b
与您的C#代码中发生的情况相比:
使用与上述相同值的示例结果:
a == 7
b == 7 - 10*7 == -63 // Not what we want...
要获得正确的结果,请在此答案顶部使用带临时变量的多行赋值:
temp1 = b // 7
temp2 = a-q*b // 5 - 10*7 == -65
a = temp1 // 7
b = temp2 // -65
Ruby首先计算RHS上的每个表达式,然后将它们分配给repsective LHS变量 下面(基本上)是Ruby如何计算第三行
a,b=b,a-q*b
:
temp1 = b
temp2 = a-q*b
a = temp1
b = temp2
具有a=5
、b=7
和q=10
的示例:
a, b = (7), (5 - 10*7)
屈服
a == 7
b == -65
如您所见,在对使用该值的RHS表达式求值之前,不会从其初始值更改任何值a
或b
与您的C#代码中发生的情况相比:
使用与上述相同值的示例结果:
a == 7
b == 7 - 10*7 == -63 // Not what we want...
要获得正确的结果,请在此答案顶部使用带临时变量的多行赋值:
temp1 = b // 7
temp2 = a-q*b // 5 - 10*7 == -65
a = temp1 // 7
b = temp2 // -65
问题是,在作业中
x, x1 = x1, x-q*x1
Ruby在执行任何一个赋值之前都会计算右侧的两个表达式。但是如果你写
x = x1
x1 = x-q*x1
然后,因为第一条语句修改了x
的值,所以表达式x-q*x1
的值也发生了变化
您需要使用一个临时变量,如下所示
newx = x1
x1 = x-q*x1
x = newx
避免过早计算表达式的影响。问题在于,在赋值中
x, x1 = x1, x-q*x1
Ruby在执行任何一个赋值之前都会计算右侧的两个表达式。但是如果你写
x = x1
x1 = x-q*x1
然后,因为第一条语句修改了x
的值,所以表达式x-q*x1
的值也发生了变化
您需要使用一个临时变量,如下所示
newx = x1
x1 = x-q*x1
x = newx
避免过早计算表达式的影响。您需要使用一些临时变量。请详细说明。为什么需要临时变量?谢谢你能提供一个有效的例子吗?看到不同的结果?C#中的变量是什么类型的?您需要使用一些临时变量。请详细说明。为什么需要临时变量?谢谢你能提供一个有效的例子吗?看到不同的结果?C#中的变量是什么类型的?