如果没有花括号并在换行后返回,那么这个带有“空”的 C 程序会发生啥?

Posted

技术标签:

【中文标题】如果没有花括号并在换行后返回,那么这个带有“空”的 C 程序会发生啥?【英文标题】:What is happening in this C program with an 'empty' if without curly braces and return after new lines?如果没有花括号并在换行后返回,那么这个带有“空”的 C 程序会发生什么? 【发布时间】:2021-01-19 01:18:17 【问题描述】:

所以我正在编写一个 C 函数,但我很难调试,最终我发现问题是一个“空”的 if 语句。但是,我怀疑它不是空的,因为没有花括号,它可能只是传递换行符,直到找到一行代码。如果这条线是一个回报,我可能会认为回报现在是“内部”的 if。如果是这种情况,如果“if”条件为假会发生什么?函数会返回什么?在我的原始函数中,它只会返回 15 或 16(当条件为假时)而不是预期的 0 或 1。我在这里留下了我正在谈论的简化代码。在这种情况下,会发生一些奇怪的事情。无论是否满足“if”条件,它似乎总是返回 1。如果我们取消注释'return 3;'鉴于第一个返回将在“if”内,代码按预期工作。这里到底发生了什么?

#include <stdio.h>
int testIf(void)
    if(0)

    return 1;
    //return 3;

int main(void)
    printf("%d\n", testIf());
    return 0;



【问题讨论】:

你是对的。它不是“空的”。这是if(0) return 1;。总是使用花括号是一种很好的风格(即使是简单的单行条件)......但这不是必需的。阅读:Why is it considered a bad practice to omit curly braces in C/C++? 这能回答你的问题吗? When can I omit curly braces in C? @Ava_Katushka 我怀疑你提出的问题是个骗子,因为它没有涵盖这个方法实际上没有返回任何东西的事实。 这是正确的答案。 ***.com/questions/4260048/… 感谢您的建议。我会看看他们。然而,我正在寻找的答案是未定义的行为,因为该函数没有返回任何内容。这也解释了为什么我在原始函数中得到不同的结果。编辑:是的,Ramy Malak 提供的那个看起来像我想要的,虽然我一开始并不知道是这样。谢谢。 【参考方案1】:

请注意,在 C 语法中,一个空格序列(例如几个换行符)等价于单个空格字符。

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

你的编译器应该已经告诉你了。您是否启用了所有警告?

【讨论】:

【参考方案2】:

那么下一行代码被认为是它的主体。

所以这个:

if(0)

    return 1;

与此具有相同的效果:

if (0) 
    return 1;

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

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

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

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

在Function returns value without return statement阅读更多内容。

【讨论】:

我还问了不满足条件时会发生什么,如本例所示。为什么还是会返回 1? '所以你的方法将终止而不返回任何东西'。好吧,事实并非如此,它肯定会返回一些东西。 @M364 不——它不会返回任何东西。调用者只是假设返回了一些东西并读取函数应该返回值的位置中的任何内容......但它不是由函数返回的。我们根本无法判断该位置存在什么。因此代码具有未定义的行为,可能会打印任何内容甚至崩溃 @M364 我更新了我的帖子来回答你所有的问题,希望对你有帮助。

以上是关于如果没有花括号并在换行后返回,那么这个带有“空”的 C 程序会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

App.post 返回空的花括号集

SecureCRT中'\n’怎么设置才能回车换行

C# winform label控件 行高 自动换行等问题

Spring REST 控制器返回带有空数据的 JSON [关闭]

shell 单中括号双中括号和gt、>和加大括号引用变量的区别

用sed替换换行符分隔的花括号