首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >scanf(参数) == 1与1 == scanf(参数)没有区别?

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

Stack Overflow用户
提问于 2013-09-18 08:42:43
回答 3查看 90关注 0票数 0

我真的很困惑,当像这样的1 == scanf("%lg", &entry)被切换到scanf("%lg", &entry) == 1时,没有什么不同。我的实验书上写的是前者,而我觉得后者是可以理解的。

1 == scanf("%lg", &entry)意味着1必须等于scanf("%lg", &entry)有人能解释这一点吗?我理解后者,即scanf("%lg", &entry)的求值必须等于1

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

代码语言:javascript
运行
复制
    #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;
    }
EN

回答 3

Stack Overflow用户

发布于 2013-09-18 09:31:08

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

但是,==的参数的计算顺序未指定。因此,如果==的一侧有可能影响另一侧的副作用,那么求值顺序将影响==操作的结果,而颠倒参数可能会导致不同的行为。因此,这样的程序将具有未定义的行为。

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

代码语言:javascript
运行
复制
a = 0;
if (scanf("%d", &a) == a) {
    ...
}

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

票数 1
EN

Stack Overflow用户

发布于 2013-09-18 08:46:16

代码语言:javascript
运行
复制
scanf("%lg", &entry) == 1

等同于

代码语言:javascript
运行
复制
1 == scanf("%lg", &entry)

然而,我曾经有一个朋友,他更喜欢

代码语言:javascript
运行
复制
1 == scanf("%lg", &entry)

因为它捕捉到了潜在的打字错误

代码语言:javascript
运行
复制
1 = scanf("%lg", &entry)

鉴于

代码语言:javascript
运行
复制
scanf("%lg", &entry) = 1

将通过编译器,ok。

票数 0
EN

Stack Overflow用户

发布于 2013-09-18 09:12:13

它们是一样的。它并不局限于scanf。用法类似

代码语言:javascript
运行
复制
if (5 == x)

被称为Yoda Conditions。这是一种防止忘记使用双=来比较相等的方法。如果有人错误地写成:

代码语言:javascript
运行
复制
if (5 = x)

然后编译器将报告该错误。另一方面,

代码语言:javascript
运行
复制
if (x = 5)

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18862101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档