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

时间:2013-09-18 00:42:43

标签: c return-value scanf

我真的很困惑,当像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}}

3 个答案:

答案 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条件,因为它对可读性不利。