大家都知道 a+b = b+a 吧?这是我们从小学就知道的事情,这是完全合理的。如果我给你 3 个苹果,然后给你 2 个苹果,情况是一样的,如果我先给你 2 个苹果,然后给你 3 个。
当然,当您参加第一门线性代数课程时,您会了解到乘法并不总是如此。在矩阵中,您学习的第一个属性之一通常是 A ⋅ B ≠ B ⋅ A 或者如数学家所说,乘法不是可交换的。
我已经n加时赛采取任何群论类,但是从我已搜查,uncommutative另外其实还真是少见。所以,当我听说加法在编程中不能交换时,就觉得很不自然。当然,经过一番思考,这是合乎逻辑的。让我们看一个 C 语言的例子。我们首先定义 2 个函数 f 和 g,以及一个全局变量“Global_var”。
<span style="background-color:#f2f2f2"><span style="color:#292929">int Global_var = 1;</span><span style="color:#292929">int f(int x){
Global_var++;
返回 x + Global_var;
}</span><span style="color:#292929">int g(int x){
返回 x + Global_var;
}</span></span>
f(1)+g(1) 等于什么?首先,Global_var 变为 2 并且 f(1) 返回 3,之后 g(1) 返回 1+2 = 3 所以 f(1)+g(1) = 3 + 3 = 6。
让我们看看 g(1) + f(1) 等于什么。Global_var 是 1 所以 g(1) 返回 2 。现在转到 f(1),Global_var 将变为 2,因此 f(1) 将返回 1+2=3 。结果将是 g(1)+f(1) =2+3 = 5 。
结论?f(1)+g(1) ≠ g(1) + f(1)
这里你可能会问的问题是为什么大多数?
解释为什么(大多数)编程语言违反加法交换律
为什么我在副标题上写得最多?
关键是不可变声明。在 Haskell 和其他一些语言中,不可变声明意味着,当您声明一个变量时,您不能再次更改该变量。Global_var++; 部分根本没有任何意义。
上面的问题来自第一个示例中的 g(1) == 3 而第二个示例中的 g(1) == 2。我们在高中时了解到函数不会随时间变化。无论如何,具有相同输入的 f(x) 将始终具有相同的输出。但是,正如我们看到的牛逼,他上面的例子,编程语言并不总是表现得像我们的“传统”的数学。
您可以在此处找到有关“数学”函数和“编程”函数之间区别的文章。
如果语言的对象是不可变的,我找不到任何地方可以消除加法的非交换性,但我坚信情况确实如此。如果有人可以为我提供证据(或在某处说明),或者当然是反例,我将不胜感激
七爪网7claw.com