【问题标题】:Confusing and unexpected behaviour of "if" statement in C [closed]C中“if”语句的令人困惑和意外的行为[关闭]
【发布时间】:2021-12-21 09:09:20
【问题描述】:

我在一系列有问题的代码示例 (http://matthieu-moy.fr/c/c_collection/) 中发现了这段代码,我研究这些代码是为了提高我的编程技能。您可以看到代码、我如何执行它以及下面的输出,以及我所做的一些实验。

谁能解释这个奇怪的现象?

代码

#include <stdio.h>

#define TRUE  1
#define FALSE 0

int function_returning_false() {return FALSE;}

int main() {
    if (function_returning_false) {
        printf("function returned true\n");
    }
}

构建

$ gcc Bug_Example_7.c -o Bug_Example_7_gcc

执行

$ ./Bug_Example_7_gcc

输出

function returned true

结论

可以假设“if”条件不成立,因此程序不会打印出任何内容。但显然,一个是错误的。我已经用 gcc (Ubuntu 9.3.0-17ubuntu1~20.04)、g++ (Ubuntu 9.3.0-17ubuntu1~20.04)、clang (10.0.0-4ubuntu1) 和在线 c 编译器 (https://www.onlinegdb.com/online_c_compiler) 编译了这段代码结果相同:打印输出“函数返回真”。

进一步的实验表明:

将“FALSE”替换为“TRUE”(参见下面的代码 sn-p),构建它,执行它,将产生相同的打印输出(“函数返回 true”)。撤消更改并再次构建并执行它不会更改输出,无论应用程序文件是否在构建之间被删除。

#include <stdio.h>

#define TRUE  1
#define FALSE 0

int function_returning_false() {return TRUE;}

int main() {
  if (function_returning_false) {
    printf("function returned true\n");
  }
}

包含stdbool-library 并将定义的“FALSE”和“TRUE”替换为“false”和“true”并没有什么不同(参见下面的代码 sn-p)。

#include <stdio.h>
#include <stdbool.h>

#define TRUE  1
#define FALSE 0

int function_returning_false() {return false;}

int main() {
  if (function_returning_false) {
    printf("function returned true\n");
  }
}

用布尔值“false”替换“if”语句中的函数“function_returning_false()”(参见下面的代码sn-p),构建它,执行它,应用程序将没有打印输出,正如预期的那样。但是,如果更改之后立即撤消并再次构建并执行代码,则应用程序将从此按应有的方式工作。删除应用程序并重新启动构建它的机器后,所述现象将再次出现。

#include <stdio.h>
#include <stdbool.h>

#define TRUE  1
#define FALSE 0

int function_returning_false() {return false;}

int main() {
  if (false) {
    printf("function returned true\n");
  }
}

感谢您的宝贵时间。

【问题讨论】:

  • 啊哈!直接从matthieu-moy.fr/c/c_collection/bool_function.c 获取代码确实会重现问题
  • 注意:该代码缺少括号:if (function_returning_false) { 所以它没有调用该函数。
  • @SamBob...您发布的链接没有调用函数
  • 好吧,该代码与发布的代码不同。 VTC 不可重现。
  • 又一个完美的例子,为什么问题应该包含导致问题的程序的精确 1:1 副本。不是一些重新输入的东西只会与真实代码失去联系。显示不正确的代码对所有相关人员来说都是浪费时间。

标签: c gcc clang


【解决方案1】:

您没有正确复制程序。这是重现错误的真实程序:

#include <stdio.h>

#define TRUE  1
#define FALSE 0

int function_returning_false() {return FALSE;}

int main() {
  if (function_returning_false) {         // note, no ()
    printf("function returned true\n");
  }
}

因此,它不是调用函数 - 它是将函数作为参数传递给 if,在布尔上下文中,函数将始终为 true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多