关于布尔类型返回值函数的一个小疑问

KevinHo 2013-10-21 07:18:07
今天遇到了这样一种类似的描述,我来举个例子,请大家帮忙解释一下。
有一些以整型数字作为函数运行状态表征的函数,但以bool类型作为其返回类型,那么很显然,0为false,非0为true。当函数返回时,在主调函数处做一个很简单的返回值检查,以判断是true还是false。这时候,比较稳妥的写法是判断返回值是否不为false,而不是判断其是否为true。请问为什么??这两种写法的不等价之处究竟在哪里,请大家指点一下。

bool function (ElemType1 p1,ElemType p2); // 比如有这样一个bool函数,实际的返回值是整型数字
//...
int main() // 将问题简化一下,在主函数里调用function函数,并把返回值赋给变量result
{
bool result = function(p1, p2);
if( result != false ) // 为什么这样的写法比较稳妥?
{
//...
}
// if( result == true ) 请问这样写为什么不如上面的写法更稳妥?
}
...全文
1396 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2013-10-25
  • 打赏
  • 举报
回复
引用 23 楼 BobYy69 的回复:
[quote=引用 12 楼 mujiok2003 的回复:]
[quote=引用 10 楼 BobYy69 的回复:]
[quote=引用 9 楼 qq6680040 的回复:]
 if( result )  //难道这样不是既稳妥又简洁而且还更高效吗? 

可读性略微受点影响,C++ Primer不提倡这样的写法[/quote]

y?[/quote]
不用why,我并不是否认这样写的对错,这样写的确很好很高效,但是可读性是个普遍意义,诸如此类的甚至是更复杂的复合表达式,甚至是某些其他带副作用的复合表达式,过分的讲究简写所带来的性能提升能有多少?就省了个!=或者==,就带来很显然的高效了么?恐怕不见得…… 我仅仅是个人意见,重申一下,您那样的写法的确很简洁很正确,并不是针对这一条语句来讨论,而是针对诸如此类的简洁追求是否有必要来说说罢了~~~
感谢您的帮助~[/quote]
看看这个吧

要针对具体类型分析, 对于bool result,以下代码毋庸置疑。

if(result) ...
if(!result) ...
Adol1111 2013-10-24
  • 打赏
  • 举报
回复
引用 24 楼 BobYy69 的回复:
请别误会,我并不是否认这样写的正确性,这样写的确很对很高效,但是可读性是个普遍意义,诸如此类的甚至是更复杂的复合表达式,甚至是某些其他带副作用的复合表达式,过分的讲究简写所带来的性能提升究竟有多少?就省了个!=或者==,就带来很可观的高性能么?再者,兴许是我表述上有问题,我在帖子内容里说到只是举个例子,而例子恰好是c/c++编译器内建数据类型,如果是windows的BOOL呢?毕竟windows的TRUE不是非0的概念,这时候如果完整的写出!=FALSE,会不会让人更好的理解其意义呢? 我仅仅说一下个人意见,重申一下,您那样的写法的确很简洁很正确,可不一定具有普遍性或者很强的逻辑性,并不是针对这一条语句来讨论,而是针对诸如此类的简洁追求是否有必要来说说罢了~~~ 很感谢你的指点!
只是C/C++比较特殊允许非bool变量(数值)做条件判断,如果是Java、C#,这些只能用bool值或者布尔表达式做条件的,都不会要求再把bool值再判断一遍,这样做即没有意义,也不会变得更直观,而且根本不会影响可读性,因为条件只会有true、false两个结果,这和性能问题没有关系。 但如果像VC++这种用TRUE、False之类的,就没办法了,C/C++这点上最大的问题就是没有禁用非bool值做判断条件,这样感觉引入bool变量根本没有太大的意义。因为更多的人更愿意用数值做判断,这样很多地方的逻辑判断写得太简洁的确会变混乱,影响可读性。不过也没有办法,因为C/C++的程序,需要更多的兼容性,去兼容过老的版本...
KevinHo 2013-10-24
  • 打赏
  • 举报
回复
引用 14 楼 Adol1111 的回复:
[quote=引用 10 楼 BobYy69 的回复:] 可读性略微受点影响,C++ Primer不提倡这样的写法
你确定可读性会有问题???如果这样写,一看就知道是bool类型了,没必要再判断一次,而且还容易出错。 还有C++ Primer怎么不提倡了?不知道你哪里看到的,至少我看过的书都没有不提倡。我只知道有些人喜欢用数值做直接判断,这点可能有些人不提倡,的确会影响可读性,但拿bool值再做判断,而说直接用bool类型会影响可读性的还真没见过。 至于MFC的TRUE、FALSE那个是宏吧,和bool类型毫无关系。 我记得之前看到过一个帖子,就是拿bool值再做判断反而出错了,你可以找找看。[/quote] 请别误会,我并不是否认这样写的正确性,这样写的确很对很高效,但是可读性是个普遍意义,诸如此类的甚至是更复杂的复合表达式,甚至是某些其他带副作用的复合表达式,过分的讲究简写所带来的性能提升究竟有多少?就省了个!=或者==,就带来很可观的高性能么?再者,兴许是我表述上有问题,我在帖子内容里说到只是举个例子,而例子恰好是c/c++编译器内建数据类型,如果是windows的BOOL呢?毕竟windows的TRUE不是非0的概念,这时候如果完整的写出!=FALSE,会不会让人更好的理解其意义呢? 我仅仅说一下个人意见,重申一下,您那样的写法的确很简洁很正确,可不一定具有普遍性或者很强的逻辑性,并不是针对这一条语句来讨论,而是针对诸如此类的简洁追求是否有必要来说说罢了~~~ 很感谢你的指点!
KevinHo 2013-10-24
  • 打赏
  • 举报
回复
引用 12 楼 mujiok2003 的回复:
[quote=引用 10 楼 BobYy69 的回复:] [quote=引用 9 楼 qq6680040 的回复:]
 if( result )  //难道这样不是既稳妥又简洁而且还更高效吗? 
可读性略微受点影响,C++ Primer不提倡这样的写法[/quote] y?[/quote] 不用why,我并不是否认这样写的对错,这样写的确很好很高效,但是可读性是个普遍意义,诸如此类的甚至是更复杂的复合表达式,甚至是某些其他带副作用的复合表达式,过分的讲究简写所带来的性能提升能有多少?就省了个!=或者==,就带来很显然的高效了么?恐怕不见得…… 我仅仅是个人意见,重申一下,您那样的写法的确很简洁很正确,并不是针对这一条语句来讨论,而是针对诸如此类的简洁追求是否有必要来说说罢了~~~ 感谢您的帮助~
max_min_ 2013-10-24
  • 打赏
  • 举报
回复
引用 19 楼 jk19941122 的回复:
mark学习了,难怪看老师的代码都是(a!=false)格式的呢
说明你们老师很不靠谱 bool 类型的判断 规范的都是 ( !a )
KevinHo 2013-10-24
  • 打赏
  • 举报
回复
引用 16 楼 qq6680040 的回复:
[quote=引用 10 楼 BobYy69 的回复:] [quote=引用 9 楼 qq6680040 的回复:]
 if( result )  //难道这样不是既稳妥又简洁而且还更高效吗? 
可读性略微受点影响,C++ Primer不提倡这样的写法[/quote] 不要总是拿C++ Primer这些权威来吓唬小朋友。先不管权威的规定是否完全正确,敢于挑战权威才会有突破和创新不是吗?圣人千虑,必有一失,对于前人总结的经验,要抱以辩证的眼光去看待,取其精华,去其糟粕。[/quote] 没有没有,我也不是教条主义的,哈~ 只是行业规范的东西,不能随意创新
KevinHo 2013-10-24
  • 打赏
  • 举报
回复
引用 15 楼 xiaohuh421 的回复:
如果是bool这种内置类型, 永远只有true,false两种结果, 所以你说的 ==true 或者 != false实际是完全等效的. 除非你的bool不是内置类型, 而是一个定义的类型, 比如VS中的BOOL 实际上是一个int类型, 这时使用 != FALSE 就是稳定的, 因为FALSE = 0, 非0就是真了, 如果==TRUE, 因为TRUE是1,除了1非零外, 还有很多非零的数. 从代码的易维护性来说也, != FALSE也要好一些, 如果你哪天想改掉函数返回值, 并且仍然以0表示成功, 其它返回错误码, 那么你的调用的地方在不使用错误码的情况下, 程序不会要任何修改,仍然可以正常运行.
嗯嗯,感谢这位大哥,受教了!!我记住了,因为刚从c++builder转到vs,所以对于MFC还处于研究阶段,今后不懂的问题,还需要您多多指点,特别感激您的帮助!
lm_whales 2013-10-22
  • 打赏
  • 举报
回复
很多人不习惯 if(a)。。。, if(!a)。。。 这种用法 而是会习惯的写出 if(a == true )。。。。,if(a == false)。。。。 这种代码。 那么当 a 是个整数的时候,就要注意了, if(a == true ) 。。。。 这个 不能表示 a!=0 他表示的是 a==1,除了1 以外,其他整数 都不等于1,即true 写成 if(a != false)。。。。 可以在这种情况下,保证程序是正确的。 也符合C 除了0,其他整数,可能还有浮点数,都表示true的传统。
lm_whales 2013-10-22
  • 打赏
  • 举报
回复
因为 -N.。。-2,-1 和 2.。。n 这许多整数, 都不等于 1 即 true 如果 简单的 if(a) ... 一定是对的 可以不用考虑,true,false 的问题 这是C本来就有的,没有任何问题。 如果 if(a == true) 那么 只有1 == true 如果 if(a != false)那么 只有0 == false , 如果a 的值是 -N.。。-2,-1,1, 2.。。n 的任何一个; 那么,都不是false; 所以 ,都满足 a != false
lpcads 2013-10-22
  • 打赏
  • 举报
回复
TRUE != true BOOL != bool
z_songlin 2013-10-22
  • 打赏
  • 举报
回复
引用 10 楼 BobYy69 的回复:
[quote=引用 9 楼 qq6680040 的回复:]
 if( result )  //难道这样不是既稳妥又简洁而且还更高效吗? 
可读性略微受点影响,C++ Primer不提倡这样的写法[/quote] 不要总是拿C++ Primer这些权威来吓唬小朋友。先不管权威的规定是否完全正确,敢于挑战权威才会有突破和创新不是吗?圣人千虑,必有一失,对于前人总结的经验,要抱以辩证的眼光去看待,取其精华,去其糟粕。
xiaohuh421 2013-10-22
  • 打赏
  • 举报
回复
如果是bool这种内置类型, 永远只有true,false两种结果, 所以你说的 ==true 或者 != false实际是完全等效的. 除非你的bool不是内置类型, 而是一个定义的类型, 比如VS中的BOOL 实际上是一个int类型, 这时使用 != FALSE 就是稳定的, 因为FALSE = 0, 非0就是真了, 如果==TRUE, 因为TRUE是1,除了1非零外, 还有很多非零的数. 从代码的易维护性来说也, != FALSE也要好一些, 如果你哪天想改掉函数返回值, 并且仍然以0表示成功, 其它返回错误码, 那么你的调用的地方在不使用错误码的情况下, 程序不会要任何修改,仍然可以正常运行.
凌典 2013-10-22
  • 打赏
  • 举报
回复
mark学习了,难怪看老师的代码都是(a!=false)格式的呢
Adol1111 2013-10-22
  • 打赏
  • 举报
回复
引用 10 楼 BobYy69 的回复:
可读性略微受点影响,C++ Primer不提倡这样的写法
你确定可读性会有问题???如果这样写,一看就知道是bool类型了,没必要再判断一次,而且还容易出错。 还有C++ Primer怎么不提倡了?不知道你哪里看到的,至少我看过的书都没有不提倡。我只知道有些人喜欢用数值做直接判断,这点可能有些人不提倡,的确会影响可读性,但拿bool值再做判断,而说直接用bool类型会影响可读性的还真没见过。 至于MFC的TRUE、FALSE那个是宏吧,和bool类型毫无关系。 我记得之前看到过一个帖子,就是拿bool值再做判断反而出错了,你可以找找看。
mujiok2003 2013-10-21
  • 打赏
  • 举报
回复
引用 10 楼 BobYy69 的回复:
[quote=引用 9 楼 qq6680040 的回复:]
 if( result )  //难道这样不是既稳妥又简洁而且还更高效吗? 
可读性略微受点影响,C++ Primer不提倡这样的写法[/quote] y?
mujiok2003 2013-10-21
  • 打赏
  • 举报
回复
bool result; //只可能为true或false
if(result)
{
  //sth
}

//or
if(!result)
{
  //sth
}
这样不是很简单
KevinHo 2013-10-21
  • 打赏
  • 举报
回复
引用 9 楼 qq6680040 的回复:
 if( result )  //难道这样不是既稳妥又简洁而且还更高效吗? 
可读性略微受点影响,C++ Primer不提倡这样的写法
z_songlin 2013-10-21
  • 打赏
  • 举报
回复
 if( result )  //难道这样不是既稳妥又简洁而且还更高效吗? 
KevinHo 2013-10-21
  • 打赏
  • 举报
回复
引用 5 楼 qq120848369 的回复:
0为假,非0为真,这是关键. 这里的顾虑可能是一些老编译器将bool当作整形存储,那么用户返回2的话,2==true可能就真的失败了。
就是说老编译器的true是1的定值么?跟MFC的TRUE一样?
KevinHo 2013-10-21
  • 打赏
  • 举报
回复
引用 4 楼 max_min_ 的回复:
[quote=引用 3 楼 BobYy69 的回复:] [quote=引用 1 楼 max_min_ 的回复:] 非零为真,值不为零就好! 但是 ==true的话,值可能不一样的!
因为所有非0都是真,所以实际的值可能不一样,然后呢?[/quote] true是一个定值吧!但是非零的话,可能的值有很多的! 你上一个接口返回值可能是非零而已!不是true对应的那个值![/quote] 可MFC里的TRUE才是定值1吧?c++语言里的true不应该是定值吧……
加载更多回复(6)
Python编程基础教程本教程旨在帮助初学者了解Python编程的基础知识和高级应用。我们将介绍Python的各个方面,包括基础语法、数据类型、控制结构、函数、文件操作、面向对象编程、模块和包、异常处理、装饰器、生成器、迭代器以及协程。1. Python基础Python是一种解释型、交互式的编程语言。它具有简单易学的语法和丰富的库,使得开发过程既快速又高效。在开始学习Python之前,建议您先熟悉基本的计算机科学概念,例如变量、数据类型、运算符等。2. 数据类型Python具有多种数据类型,包括数字(整数和浮点数)、字符串、布尔值、列表、元组、集合和字典等。这些数据类型在Python中有着广泛的应用,从简单的数值计算到复杂的数据处理。3. 控制结构控制结构是编程中的基本组成部分,它们决定了程序如何执行。Python支持条件语句(if-elif-else)和循环语句(for和while),可以根据程序中的特定条件和情况来选择适当的操作。4. 函数函数是封装一段代码的便捷方式,它们可以在需要时被调用。在Python中,您可以定义函数,并使用参数来传递数据。函数可以返回值,以便在调用它们时使用。5. 文件操作文件操作是编程中常见的任务之一。Python提供了许多内置的函数和方法来进行文件操作,如读取、写入和删除文件等。此外,Python还支持对文件进行高级操作,如读写二进制文件、文件锁定等。6. 面向对象编程面向对象编程是一种流行的编程范式,它使用类和对象的概念来构建复杂的系统。Python支持面向对象编程,您可以使用类来定义对象,并使用继承和多态等特性来扩展和定制对象的行为。7. 模块和包模块和包是Python中组织代码的重要工具。模块是一个包含Python代码的文件,而包则是一个包含多个模块的目录。通过使用模块和包,您可以轻松地组织和管理大型项目中的代码。8. 异常处理异常处理是Python中处理错误的方式之一。当程序中出现错误时,Python会抛出一个异常。通过使用try-except语句块,您可以捕获并处理这些异常,以确保程序的稳定性。9. 装饰器装饰器是Python中的高级功能之一,它允许您在函数或方法之间添加额外的功能,而不改变其原始实现。装饰器是一种强大的工具,可用于实现各种功能,如日志记录、性能分析等。10. 生成器生成器是Python中的一种特殊类型的迭代器。通过使用生成器函数和方法,您可以在需要时生成数据,而不是一次性生成所有数据。这使得生成器在处理大量数据时非常有用,因为它们可以节省内存空间。11. 迭代器和协程迭代器和协程是Python中的两个重要概念。迭代器允许您遍历容器类型的数据结构(如列表和元组),而协程则是一种异步编程的方式,它允许您在程序中执行多个任务并发执行。这两个概念在处理大量数据和高性能应用程序方面非常有用。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧