我真的很困惑,当像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}}
答案 0 :(得分:1)
一般来说,(1 == scanf(...))
的行为与(scanf(...) == 1)
的行为相同,不应感到惊讶,因为相等是symmetric。但是,这是因为其中一个操作数是幂等的(特别是文字常量1
)。 scanf()
是唯一具有副作用的表达式,因此当==
的参数被颠倒时,不可能对代码进行不同的解释。
但是,==
的参数的评估顺序未指定。因此,如果在==
一侧有副作用可能会影响另一方,则评估顺序将影响==
操作的结果,并且反转参数可能会导致不同的行为。因此,这样的程序将具有不确定的行为。
作为一个愚蠢的例子,请考虑:
a = 0;
if (scanf("%d", &a) == a) {
...
}
该代码段具有未定义的行为,因为未指明a
右侧的==
是否是上述语句中初始化为的旧值,或者是新值可能已提供scanf()
来电。更改参数的顺序可能会导致程序行为不同,但行为仍未定义。
答案 1 :(得分:0)
scanf("%lg", &entry) == 1
与
相同1 == scanf("%lg", &entry)
然而,我曾经有一位喜欢
的朋友1 == scanf("%lg", &entry)
因为它抓住了潜在的错字
1 = scanf("%lg", &entry)
而
scanf("%lg", &entry) = 1
将通过编译器确定。
答案 2 :(得分:0)
他们是一样的。它不仅限于scanf
。用法如
if (5 == x)
被称为Yoda Conditions。这是一种防止忘记使用双=
来比较相等性的方法。如果错误地写道:
if (5 = x)
然后编译器将报告错误。另一方面
if (x = 5)
是有效的C(它将x
赋值为1
,并返回值5
,即true,因此编译器可能不会对此发出警告。< / p>
这只是一种编码风格,如果你写if (x = 5)
,许多现代编译器会警告你。如果在您的情况下确实如此,我建议不要使用Yoda条件,因为它对可读性不利。