首页 > 解决方案 > C在短路表达式中对同一变量进行多次赋值

问题描述

我有三个变量:a, b, c. 假设它们是整数。我想以特定顺序找到其中的第一个非零值,而无需循环。以下似乎可行,但我不确定这是因为我很幸运,还是因为语言保证了它:

int main(int argc, char *argv[]) {
    int a = 0;
    int b = 3;
    int c = 5;
    int test;

    if ((test = a) != 0 || (test = b) != 0 || (test = c) != 0) {
        printf("First non-zero: %d\n", test);
    } else {
        printf("All zero!\n");
    }

    return 0;
}

此处显示的带有短路的重复分配是否可以保证按预期工作,还是我遗漏了什么?

这可能是一个可以接受三个字母答案的地方,但两个字母的答案可能需要更多解释。

标签: c

解决方案


它会!

由于 OR 运算符的性质,如果任何条件为真,则测试停止。

因此,我认为您所做的基本上相当于:

test = a != 0 ? a : b != 0 ? b : c != 0 ? c : 0;
printf("%d\n",test);

但是你的看起来不错。

[更新]

根据 chqrlie 提到的,它可以进一步简化为:

test = a ? a : b ? b : c;

推荐阅读