gpt4 book ai didi

c - scanf(参数) == 1 vs 1 == scanf(参数) 没有区别吗?

转载 作者:行者123 更新时间:2023-11-30 15:45:43 27 4
gpt4 key购买 nike

我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。

1 == scanf("%lg", &entry) 表示 1 必须等于 scanf("%lg", &entry) 谁能解释一下这个吗?我理解后者,即 scanf("%lg", &entry) 的评估必须等于 1

我尝试传递很多不同的值,但没有什么区别。

    #include <stdio.h>
#include <stdlib.h>

int main(void) {
double entry = 0.0;
double total = 0.0;
int number_of_entries = 0;
while (scanf("%lg", &entry) == 1 ) {
total += entry;
number_of_entries++;
}
/* print the average of all the entries */
printf("%f\n", total / number_of_entries);
return EXIT_SUCCESS;
}

最佳答案

一般来说,您不应该对(1 == scanf(...))感到惊讶。行为与 (scanf(...) == 1) 相同,因为相等是 symmetric 。然而,之所以如此,是因为其中一个操作数是幂等的(特别是文字常量 1 )。 scanf()是唯一具有副作用的表达式,因此当 == 的参数时,不可能对代码进行不同的解释。是相反的。

但是,== 的参数的求值顺序未指定。所以,如果在 == 一边具有可以影响另一方的副作用,那么评估顺序将影响 == 的结果操作,并且反转参数可能会导致不同的行为。因此,这样的程序将具有未定义的行为。

作为一个愚蠢的例子,请考虑:

a = 0;
if (scanf("%d", &a) == a) {
...
}

该代码片段具有未定义的行为,因为未指定 a 是否在 == 的右侧将是上面语句中初始化的旧值,或者 scanf() 的新值。电话可能已提供。更改参数的顺序可能会导致程序表现不同,但该行为仍然未定义。

关于c - scanf(参数) == 1 vs 1 == scanf(参数) 没有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18862101/

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