是什么导致 Go 和 C 中的等效代码输出不同?

问题描述 投票:0回答:1

我正在学习编程语言,并试图了解它们背后的设计原则。下面是 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 go programming-languages
1个回答
0
投票

在 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

© www.soinside.com 2019 - 2024. All rights reserved.