这个退货声明有什么意义吗?

时间:2016-02-15 08:27:33

标签: c++ return boolean implicit-conversion

我想知道在我看到的代码的一部分中是否有任何重要意义

return (num!=0);

其中num是一个int。这是一个布尔函数的return语句,如果num != 0想要返回TRUE,如果num = 0则返回false。

我不确定这是否存在隐藏的意义,但我不明白为什么他们不能简单地写:

return num;

以下是我看到的代码:

bool SemClass::cut(int &a, int &b, int &c) 
{
  int num = 0;    
  check(a, num);
  check(b, num );
  check(c, num);
  return (num != 0);
}

3 个答案:

答案 0 :(得分:6)

通过隐式转换以System.Byte[]形式返回时,整数,浮点和无范围枚举的值0以及空指针和空指针到成员值将变为false。其他值(如1,2,3,4等)映射为true。该公约通过其流程控制声明在原始C中建立; C当时没有布尔类型。

隐式转化:en.cppreference.com/w/cpp/language/implicit_cast

在这种情况下,在C ++中,编写booleannum都很好。但是,num!=0可能会使该方法返回布尔值更明显。从技术上讲,只有值num!=0的整数等于布尔值false,而所有其他值等于布尔值true。通过编写0,明确表示如果num不等于0,则该方法将返回true,如果是,则返回false。

良好的做法规定,如果它是真正的真值,那么你应该使用num!=0,因为它使调用者非常清楚将返回什么。返回boolean时,可以将其视为代码/枚举类型值。

因此,integer在这种情况下优先于num!=。但是,不需要括号。如果在方法返回num时返回integer,某些编译器也会发出警告。

答案 1 :(得分:2)

作者可能写过return num,编译器会生成完全相同的二进制文件。在这里,作者试图明确并尽可能地让读者猜测函数返回的内容。

当快速阅读器看到return num知道numint并且当前函数返回bool时,他需要停止一小部分一秒钟到几秒钟(取决于它的浓度和C ++的易用性),要记住一个整数可以隐式转换为带有映射0 -> false, anything else -> true的布尔值。那么,为什么不写下来呢?

当快速阅读器看到return num!=0,(s)时,他猜测当前函数返回一个布尔值(否则它可能是可疑的),并且很容易理解返回值的含义。

根据经验,我建议选择更明确的写作,当它不会损害阅读时,以及何时只需要几个(或更少)字符。不要忘记你没有编写编译器的代码,你为许多工作或将与你一起工作的其他开发人员编写代码(r代码)。 C ++在20年内可能不太常见,如果你的程序不仅可以被大师轻松理解,而且可以被大家理解(我在那里概括,不仅仅是讨论隐式的布尔转换),这将是很好的。

答案 2 :(得分:1)

作者在两个方面(过分)谨慎:

  1. 括号是多余的。

  2. C ++中的任何数字类型都隐式转换为bool:如果数字为零,则为false,否则为true

  3. 我个人更喜欢裸体return num;,因为我觉得更清楚。

    (注意,在C中,关系运算符返回int类型1和0,而不是truefalse)。