将 C 移植到 Go,在 if 检查中修改变量

Porting C to Go that modifies a variable in an if check

我正在尝试将以下 C 代码移植到 Go:

if (x == 0 || x-- == 0) {
    // Stuff
}

这在 Go 中是不合法的,因为我不能在检查子句中修改 x

在 Go 中表示这个的好方法是什么?复制块的内容?

如果 x-- 是一个拼写错误,应该是 --x,那么我将对 x 进行明确的更改:

if x == 0 || x == 1 {
    x = 0

    // Stuff
} else {
    x--
}

否则,您的 C 代码有错误。如果 x == 0 为假,则 x-- == 0 也将为假,因为您使用的是 post 递增运算符。因此,代码相当于:

if (x == 0) {
    // Stuff
} else {
    x--;
}

围棋代码

    if x != 0 {
        x--
    } else {
        // Stuff
    }

相当于C代码

    if (x == 0 || x-- == 0) {
        // Stuff
    }

例如,在围棋中,

package main

import (
    "fmt"
)

func main() {
    for _, x := range []int{-42, -2, -1, 0, 1, 2, 42} {
        fmt.Printf("x %d:", x)
        if x != 0 {
            x--
        } else {
            fmt.Printf(" Stuff %d:", x)
        }
        fmt.Printf(" x %d:\n", x)
    }
}

输出:

x -42: x -43:
x -2: x -3:
x -1: x -2:
x 0: Stuff 0: x 0:
x 1: x 0:
x 2: x 1:
x 42: x 41:

例如,在 C 中,

#include <stdio.h>

int main() {
    int a[] = {-42,-2,-1,0,1,2,42};
    for (int i = 0; i < (sizeof a)/sizeof a[0]; i++) {
        int x = a[i];
        printf("x %d:", x);
        if (x == 0 || x-- == 0) {
            printf(" Stuff %d:", x);
        }
        printf(" x %d:\n", x);
    }
}

输出:

x -42: x -43:
x -2: x -3:
x -1: x -2:
x 0: Stuff 0: x 0:
x 1: x 0:
x 2: x 1:
x 42: x 41: