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),人们会编写
的原因也是一样的:他们对语言的了解不够,无法编写简单的代码。