c语言 如果要定义函数的返回类型为布尔类型,怎么定义?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 如果要定义函数的返回类型为布尔类型,怎么定义?相关的知识,希望对你有一定的参考价值。

参考技术A

需要准备的材料分别有:电脑、C语言编译器。

1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。

2、在test.cpp文件中,输入C语言代码:

bool fun()

return true;

 

3、编译器运行test.cpp文件,此时打印出了布尔类型函数返回结果的打印结果。

返回啥;在布尔返回类型的 C 函数中返回?

【中文标题】返回啥;在布尔返回类型的 C 函数中返回?【英文标题】:What does return; in a C function of boolean return type return?返回什么;在布尔返回类型的 C 函数中返回? 【发布时间】:2015-01-18 11:56:28 【问题描述】:

说一个布尔返回类型的 C 函数(布尔可以实现为 0 和 1 的枚举或其他方式,但这并不重要):

boolean foo ()

  //do something

  return;

这会返回什么?它返回 FALSE 吗?还是它只是退出函数而没有任何返回?期望从 foo 返回的函数会收到什么?

【问题讨论】:

那是未定义的行为,不是吗?你的编译器应该抱怨这个。 不确定时,运行代码。 如果您在return 之后添加FALSE,那么它将返回FALSE。如果您在return 之后添加TRUE,那么它将返回TRUE。调用 foo 的函数应该期望 boolean 值。 @siu 在许多情况下运行具有未定义行为的代码根本不会告诉您任何有用的信息。 【参考方案1】:

这是未定义的行为,没有表达式的 return 语句只能在返回类型为 void 的函数中使用。这在draft C99 standard 部分6.8.6.4 中进行了介绍return 语句

[...]没有表达式的 return 语句只能出现在函数中 其返回类型为 void。

有趣的是,使用clang 时默认这是一个错误,但没有任何标志的gcc 似乎允许此代码甚至没有警告。对于gcc,使用-std=c99 会将其变为警告,使用-pedantic-errors 标志会使其变为错误。

在使用 gccclang 编译 C 程序时习惯使用的一组很好的标志如下:

-std=c99 -Wall -Wextra -Wconversion -pedantic

-std 调整为您所针对的适当标准。

【讨论】:

要使用 gcc 将代码编译为 C 代码,您必须使用-std=cXX -pedantic-errors。如果你不包括这两个选项,gcc 仍然是一个废话,而不是它可以设置为的好的、严格符合的编译器。 @Lundin 我通常最后使用-std=c99 -Wall -Wextra -Wconversion -pedantic 进行测试,但似乎大多数人通常不使用标志。【参考方案2】:

根据(草案)C99 标准,6.8.6.4 The return statement 部分(第 1 段):

带有表达式的返回语句不应出现在函数中 其返回类型为 void。没有表达式的 return 语句 只能出现在返回类型为 void 的函数中。

所以代码是无效的。

使用带有 -Wall 的 GCC 编译它会引发错误:

警告:'return' 没有值,在函数中返回非 void [-Wreturn-type]

虽然它在不使用 -Wall 时编译并返回 1(真),但我猜这是 GCC 很好(?)。

(取自 WG14/N1256 委员会草案 — 2007 年 9 月 7 日 ISO/IEC 9899:TC3

【讨论】:

【参考方案3】:

忽略此代码具有未定义行为的事实,因为它缺少 return 语句的值....

当在实际定义了位寄存器和相关编译器的 CPU 上运行时,返回的布尔值将在进位标志中。

当在大多数实际上没有定义位寄存器和相关编译器的现代 CPU 上运行时,它将返回一个 int 值。但是现代编译器(启用所有警告)不会编译文件,但会引发有关无效返回类型(或类似语句)的警告

【讨论】:

以上是关于c语言 如果要定义函数的返回类型为布尔类型,怎么定义?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中有bool类型吗?

c语言中的布尔类型、枚举类型是个啥概念?

c语言bool啥意思

C语言返回结构体函数返回值应定义哪种类型?

C语言返回结构体函数返回值应定义哪种类型?

C语言自定义数据类型