gpt4 book ai didi

c - C 中 if(function() == TRUE) 的任何原因

转载 作者:太空狗 更新时间:2023-10-29 16:51:49 26 4
gpt4 key购买 nike

问题:执行 if(SomeFunction() == TRUE) 而不是执行 if(SomeFunction()) 是否可以防止某种类型的编码错误?我试图了解这是否是为了防止某些隐藏的地雷,或者这是不是有人编写的代码不太了解如何计算表达式的结果。我知道如果做对了,这两件事的评价是一样的。就像 if(value == 42)if(42 == value) 评估相同 - 不过,有些人更喜欢第二个版本,因为如果有人,它会产生编译器错误打字错误是 == 而是写成 =。

背景:我继承了一些 4 或 5 年前由不再在这里工作的人编写的嵌入式软件。我正在进行一些重构以摆脱数百行函数和全局变量以及所有爵士乐,所以这个东西是可读的,我们可以继续维护它。 pic 微处理器的代码是 c。这可能相关也可能不相关。代码中有各种奇怪的东西,尖叫着“不知道他们在做什么”,但这里有一个特定的模式(反模式?),我试图了解是否有充分的理由

模式:这里有很多采用以下形式的 if 语句

if(SomeFunction() == TRUE){
. . .
}

其中 SomeFunction() 定义为

BOOLEAN SomeFunction(void){
. . .
if(value == 3)
return(FALSE);
else
return(TRUE);
}

让我们忽略 SomeFunction 从 if 语句主体返回 TRUE 或 FALSE 的奇怪方式,以及它们使“return”看起来像函数调用的奇怪方式。

这似乎打破了 c 认为“true”和“false”的正常值,他们真的想确保返回的值等于定义为 TRUE 的任何值。这几乎就像他们正在制造三种状态 - TRUE、FALSE 和“其他”并且他们不希望在返回“其他”时采用“if”语句。

我的直觉是,这是一个奇怪的反模式,但我想让这些人从怀疑中获益。例如,我认识到 if(31 == variable) 看起来有点奇怪,但它是这样写的,所以如果您打错了 ==,您就不会不小心将 31 分配给变量。写这篇文章的人是不是遇到了类似的问题,或者这只是胡说八道。

附加信息

  • 当我写这个问题的时候,我的印象是 stdbool 不可用,但我现在看到它是由 IDE 提供的,只是没有在这个项目中使用。这让我更倾向于“没有充分的理由这样做。”
  • 看起来 BOOLEAN 被定义为 typedef enum _BOOLEAN { FALSE = 0, TRUE } BOOLEAN;
  • 这里提到的开发环境是MPLAB 8.6

最佳答案

Is there a good reason for doing if(SomeFunction() == true) instead of doing if(SomeFunction())

没有。

如果SomeFunction()返回 _Bool 类型的结果,那么相等比较应该是可靠的(假设结果的评估不涉及未定义的行为)。但是使用TRUE而不是 true , 和类型名称 BOOLEAN而不是 _Boolbool , 建议结果不是实际的 _Bool (仅在 C99 或更高版本中可用),但一些临时的类似 bool 类型——可能是 int 的别名.

任何标量类型的值都可以用作 if 中的条件陈述。如果该值等于零,则条件为假;否则,条件为真。如果TRUE定义为 1 , 和 SomeFunction()返回,比如说,3 , 那么测试就会失败。

写作

if (SomeFunction()) { /* ... */ }

更简单、更清晰,并且更有可能正确运行。

例如,注意 isdigit()等函数在 <ctype.h> 中声明不要只返回 01 ;如果参数是数字,isdigit()可以(并且确实)返回任何非零值。使用它的代码应该能正确处理它——通过比较它是否与1相等。 , 至 true , 或 TRUE .

话虽如此,可能有正当理由将某些东西与 TRUE 进行比较-- 如果结果是否等于 TRUE 很重要或具有其他一些非零值。但在那种情况下,使用名称 BOOLEANTRUE具有误导性。 bool 类型的全部要点在于值要么为真要么为假。没有“也许”之分,如果碰巧有不同的真理表述,你不应该关心你有哪一个。

我尝试遵循的准则是:

从不 比较逻辑上是否相等或不相等的 bool 值与 truefalse (或 01FALSETRUE)。只需直接测试值,使用 !运算符,如果你想反转测试。 (“逻辑 bool ”值要么属于 _Bool 类型,要么用于在没有附加信息的情况下区分真假。如果 _Bool 不可用,后者可能是必需的。)与 false 的比较可以安全,但没有理由这样做;直接对比数值还是比较清楚的。

如果有人告诉你

if (SomeFunction() == true)

优于

if (SomeFunction())

问问他们为什么

if ((SomeFunction() == true) == true)

甚至更好。

另请参阅 comp.lang.c FAQ 的第 9 节.它对 C99 之前解决方案的强调可能有点过时,但它仍然有效。

更新:问题询问一个返回值 TRUE 的函数。类型 BOOLEAN , 定义如下:

typedef enum { FALSE, TRUE } BOOLEAN;

这样的定义在 1999 年以前的 C 中很有用,但 C99 添加了预定义的 bool 类型 _Bool和标题 <stdbool.h> ,它定义宏 bool , false , 和 true .我目前的建议:使用 <stdbool.h>除非非常担心您的代码可能需要与不支持它的实现一起使用。如果这是一个问题,您可以使用

typedef enum { false, true } bool;

typedef int bool;
#define false 0
#define true 1

(我更喜欢第一个。)这不是 100% 兼容 C99 定义,但如果您明智地使用它,它会正常工作。

关于c - C 中 if(function() == TRUE) 的任何原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36459934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com