C++ 布尔函数与真/假函数的比较
我有一个布尔函数:C++ 布尔函数与真/假函数的比较,c++,C++,我有一个布尔函数: bool func(int x, int y){ // do something if (x==y){ return true; } } 当我在if循环中使用函数时 if (func(x, y)){ // do something } 这和我的想法不一样 if (func(x, y) == true){ // do something } 这是什么原因 顺便说一句:我正在使用Visual Studio 2015
bool func(int x, int y){
// do something
if (x==y){
return true;
}
}
当我在if循环中使用函数时
if (func(x, y)){
// do something
}
这和我的想法不一样
if (func(x, y) == true){
// do something
}
这是什么原因
顺便说一句:我正在使用Visual Studio 2015
谢谢 if语句与
语句完全相同。它们在逻辑上是等价的
问题在于,如果比较失败,func
不会返回值
这会导致未定义的行为
当您试图编译时,如果您的编译器对您大喊大叫,这将说明为什么您不应该忽略编译器发出的警告消息
如果您的编译器是静默的,请查看其文档,了解如何打开其他警告。If
语句与之完全相同。它们在逻辑上是等价的
问题在于,如果比较失败,func
不会返回值
这会导致未定义的行为
当您试图编译时,如果您的编译器对您大喊大叫,这将说明为什么您不应该忽略编译器发出的警告消息
如果编译器处于静默状态,请查看其文档,了解如何打开其他警告。If语句确实相同,但代码的问题是,如果
x
不等于y
,则无法返回任何内容。老实说,这段代码甚至不应该编译,因为VC++应该意识到,如果x
不等于y
,它将不会返回任何内容,并且此函数将无法按预期运行。为了更安全,您可能希望将代码更改为:
bool func(int x, int y){
// do something
return x==y;
}
这使得它无论发生什么都返回布尔值。如果x等于y,则返回true,否则返回false。同样,这一定是VisualStudio编译器的错误,否则您没有提供正确的代码。仅供参考:如果这是g++或clang++编译器,由于我解释的原因,该代码将不会编译
您应该使用-Wall
(所有警告)为VC++编译器打开附加警告。这将帮助您实现以下目标:
始终确保已打开
-Wall
以获得“安全”代码,并且还确保如果发生任何情况,函数将返回,除非它是无效的
/无返回函数。这通常是由像clang++这样的编译器完成的。有一个用于clang++和VA的插件:。您还可以在Visual Studio插件管理器中搜索clang,直接从IDE安装。if语句确实相同,但代码的问题是,如果x
不等于y
,则无法返回任何内容。老实说,这段代码甚至不应该编译,因为VC++应该意识到,如果x
不等于y
,它将不会返回任何内容,并且此函数将无法按预期运行。为了更安全,您可能希望将代码更改为:
bool func(int x, int y){
// do something
return x==y;
}
这使得它无论发生什么都返回布尔值。如果x等于y,则返回true,否则返回false。同样,这一定是VisualStudio编译器的错误,否则您没有提供正确的代码。仅供参考:如果这是g++或clang++编译器,由于我解释的原因,该代码将不会编译
您应该使用-Wall
(所有警告)为VC++编译器打开附加警告。这将帮助您实现以下目标:
始终确保已打开
-Wall
以获得“安全”代码,并且还确保如果发生任何情况,函数将返回,除非它是无效的
/无返回函数。这通常是由像clang++这样的编译器完成的。有一个用于clang++和VA的插件:。您还可以在Visual Studio插件管理器中搜索clang,直接从IDE安装。它甚至不应该编译!OP可能考虑更改<代码>(x==y){true true;}更简单和正确的<代码>返回x==y;<代码>。如果您可以避免实际键入true
/false
,而让您的测试为您执行,我发现它通常会生成更好的代码。@sergiol:它通常会编译,尽管有警告。它甚至不应该编译!OP可能考虑更改<代码>(x==y){true true;}更简单和正确的<代码>返回x==y;<代码>。如果您可以避免实际键入true
/false
,而只是让您的测试为您执行,我发现它通常会生成更好的代码。@sergiol:它通常会编译,尽管有警告。它通常会编译,尽管有警告。请参阅新答案@ShadowRangerIt's not a compiler bug;未能从函数返回是未定义的行为,没有诊断要求。它通常会编译,尽管有警告。请参阅新答案@ShadowRangerIt's not a compiler bug;未能从函数返回是未定义的行为,没有诊断要求:“这是什么原因?”--这与人们编写的原因相同,如果(((func(x,y)=true)=true)
:他们不太了解语言,无法编写简单的代码。Re:“这是什么原因?”--如果((func(x,y)==true)==true),人们会编写的原因也是一样的:他们对语言的了解不够,无法编写简单的代码。