0

我真的很困惑,当这种喜欢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;
    }
4

3 回答 3

1

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

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

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

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

该片段具有未定义的行为,因为未指定a右侧的==是在上面的语句中初始化的旧值,还是scanf()调用可能提供的新值。更改参数的顺序可能会导致程序的行为不同,但行为仍然未定义。

于 2013-09-18T01:31:08.323 回答
0
scanf("%lg", &entry) == 1

是相同的

1 == scanf("%lg", &entry)

但是,我曾经有一个朋友喜欢

1 == scanf("%lg", &entry)

因为它抓住了潜在的错字

1 = scanf("%lg", &entry)

然而

scanf("%lg", &entry) = 1

将通过编译器确定。

于 2013-09-18T00:46:16.117 回答
0

他们是一样的。并且不限于scanf. 用法如

if (5 == x)

称为尤达条件。这是一种防止忘记使用 double=来比较相等性的方法。如果一个人写错了:

if (5 = x)

然后编译器会报错。另一方面

if (x = 5)

是有效的 C(它将分配x的值1,并返回该值5,即 true),因此编译器可能不会警告您。

它只是一种编码风格,许多现代编译器会在你编写if (x = 5). 如果你的情况是这样,我建议不要使用尤达条件,因为它不利于可读性。

于 2013-09-18T01:12:13.360 回答