如果没有大括号并在新行后返回,则'empty' C 程序中会发生什么?



所以我在写一个C函数,但调试时遇到了困难,最终我发现问题是一个"空"if语句。然而,我怀疑它不是空的,因为没有大括号,它可能只是传递换行符,直到找到一行代码。如果这行是一个return,我可能认为return现在在If内部。如果是这样,如果If条件为false会发生什么?函数会返回什么?在我最初的函数中,它只返回15或16(当条件为false时(,而不是预期的0或1。我在这里留下一个我所说内容的简化代码。在这种情况下,会发生一些奇怪的事情。不管"if"条件是否满足,它似乎总是返回1。如果我们取消注释"return 3;"如果第一个返回位于"if"内部,则代码将按预期工作。这里到底发生了什么?

#include <stdio.h>
int testIf(void){
if(0)
return 1;
//return 3;
}
int main(void){
printf("%dn", testIf());
return 0;
}

请注意,在C语法中,一系列空白字符,例如几行换行符,相当于一个空白字符。

代码(带有注释return 3(具有未定义的行为,因为非void函数不会为所有执行路径返回值。(main有一个例外,你不想知道。(

你的编译器应该告诉你这件事。是否启用了所有警告?

然后下一行代码被认为是它的主体。

所以这个:

if(0)
return 1;

与此效果相同:

if (0) {
return 1;
}

现在,对于您的,方法,因为if语句的条件被硬编码为0,所以它的计算结果总是为false,并且return语句不会执行。

return 3;也不会执行,因为它已被注释。因此,您的方法将在不执行任何返回语句的情况下终止,尽管它被定义为返回int

此代码调用Undefined Behavior(UB(,因为我们无法确定它将返回什么值,因为它缺少有效的返回语句。对你来说,今天恰好是1点。在我的笔记本电脑里,它可能是垃圾。因此,这个代码是错误的。

我强烈建议您启用编译器警告,例如,在使用GCC编译时通过传递Wall和/或Wextra标志,以获得此类逻辑错误的警告。

阅读函数中的更多信息,返回值而不返回语句。

相关内容

最新更新