我正在学习编程语言,并试图了解它们背后的设计原则。下面是 C 和 Golang 的代码,用于简单测试关联性和优先级。
#include <stdio.h>
int a(int* n) {
*n += 1;
return 2*(*n) - 3;
}
int main() {
int i = 4, j = 4;
int sum1 = (i*2) + a(&i);
int sum2 = a(&j) + (j*2);
printf("sum1: %d\n", sum1);
printf("sum2: %d\n", sum2);
return 0;
}
package main
import "fmt"
func a(n *int) int {
*n += 1
return 2*(*n) - 3
}
func main() {
i, j := 4, 4
sum1, sum2 := (i*2)+a(&i), a(&j)+(j*2)
fmt.Println("sum1:", sum1)
fmt.Println("sum2:", sum2)
}
C输出:
总和1:15
总和2:17
Go 输出时:
总和1:17
总和2:17
我在Golang中看到a()是先求值的,但是我很难理解Golang为什么这样做以及背后的原理。我想澄清的是,我不需要两个总和相等,我试图理解为什么两种语言中的表达式的计算方式不同。从本质上讲,理解概念比结果更重要。
代码旨在证明它们的评估顺序可能因语言而异。例如,在没有指针的语言中,输出相同的原因是不同的,因为使用 a() 不会改变 main 方法中 i, j 的值。
在 C 示例中,评估顺序未定义。在这种情况下似乎如下:
int sum1 = (i*2) + a(&i);
被评价为:
(4*2) + a(&i) --> 8 + 7
在 Go 示例中:
(i*2)+a(&i)
首先评估
a(&i)
表达式,它产生7
,但留下i
为5
,所以2*5 + 7
是17
。