gpt4 book ai didi

c - C短路表达式中对同一变量的多个赋值

转载 作者:行者123 更新时间:2023-12-03 13:50:24 24 4
gpt4 key购买 nike

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

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中的大多数运算符不同,它们保证左操作数的求值先于右操作数的求值(执行)。这就是代码起作用的原因。还可以保证,如果足以评估左边的操作数(“短路”),则不会评估右边的操作数。总结于C17 6.5.14/4:

Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares unequal to 0, the second operand is not evaluated.



这里的关键是“序列点”,这就是使表达式具有确定性的结果。

如果您几乎使用了其他任何运算符(例如按位 |),那么结果将是不确定的,因为在同一表达式中的同一变量 test上有多个副作用(赋值)。

相同算法的更完善的版本将涉及将数据存储在数组中并循环遍历。

关于c - C短路表达式中对同一变量的多个赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61744860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com