我真的很困惑,当像这样的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;
}
发布于 2013-09-18 09:31:08
一般来说,您不应该对(1 == scanf(...))
的行为与(scanf(...) == 1)
相同感到惊讶,因为相等就是symmetric。然而,这是因为其中一个操作数是幂等的(特别是文字常量1
)。scanf()
是唯一有副作用的表达式,因此当==
的参数颠倒时,不可能对代码进行不同的解释。
但是,==
的参数的计算顺序未指定。因此,如果==
的一侧有可能影响另一侧的副作用,那么求值顺序将影响==
操作的结果,而颠倒参数可能会导致不同的行为。因此,这样的程序将具有未定义的行为。
作为一个愚蠢的例子,考虑一下:
a = 0;
if (scanf("%d", &a) == a) {
...
}
该代码段具有未定义的行为,因为未指定==
右侧的a
是上面语句中初始化为的旧值,还是scanf()
调用可能提供的新值。更改参数的顺序可能会导致程序的行为不同,但行为仍未定义。
发布于 2013-09-18 08:46:16
scanf("%lg", &entry) == 1
等同于
1 == scanf("%lg", &entry)
然而,我曾经有一个朋友,他更喜欢
1 == scanf("%lg", &entry)
因为它捕捉到了潜在的打字错误
1 = scanf("%lg", &entry)
鉴于
scanf("%lg", &entry) = 1
将通过编译器,ok。
发布于 2013-09-18 09:12:13
它们是一样的。它并不局限于scanf
。用法类似
if (5 == x)
被称为Yoda Conditions。这是一种防止忘记使用双=
来比较相等的方法。如果有人错误地写成:
if (5 = x)
然后编译器将报告该错误。另一方面,
if (x = 5)
是有效的C(它会将1
的值赋给x
,并返回值5
,即true),因此编译器可能不会警告您。
这只是一种编码风格,如果你写了if (x = 5)
,很多现代编译器都会警告你。如果您的情况是这样,我建议不要使用Yoda条件,因为它不利于可读性。
https://stackoverflow.com/questions/18862101
复制相似问题