【发布时间】: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 副本。不是一些重新输入的东西只会与真实代码失去联系。显示不正确的代码对所有相关人员来说都是浪费时间。