【发布时间】:2011-01-16 06:43:10
【问题描述】:
据我所知,在 c 中使用布尔值有 3 种方法
- 使用bool类型,从此使用true和false
- 使用预处理器定义
#define FALSE 0 ... #define TRUE !(FALSE) - 只是直接使用常量,即 1 和 0
还有其他我错过的方法吗?不同方法的优缺点是什么?
我想最快的是数字 3,2 仍然更容易阅读(尽管按位取反会稍微增加开销),1 是最易读的,不兼容所有编译器。
【问题讨论】:
-
你真的认为编译器会等到运行时来否定一个常量?
-
跟进,所以我看起来不像个混蛋,没有编译器实际上会浪费时间这样做。编译器是重型优化器,如果它知道结果总是相同的,它就会把它放在那里。它永远不会等到运行时评估
int i = 12 + 3 * 4;;它只会说int i = 24;。担心这样的性能是一个常见问题,不要感到难过。优化最后出现,当它出现时,您必须对代码进行计时并查看汇编输出,而不是猜测。即使它确实花费了一个周期,我也会选择最易读的解决方案。只有当它被证明是一个 -
问题我是否会切换到更快的解决方案,对它们进行计时以确保它们确实更快。在可读性和循环之间进行选择时,请选择可读性。 :) 快速编写好代码很容易,但要编写好“快速”代码却很难。
-
使用宏时,请记住
(x == TRUE)与(x)不同。只有当x拥有TRUE的值时,前者才成立。后者适用于任何非零值。 -
我建议不要定义特殊的布尔宏;这只会诱使新手程序员编写诸如
if(foo == TRUE)或if(foo == FALSE)之类的东西,这在大多数语言中是一种暴行,但在C 中更是如此,其中任何标量值!= 0在布尔上下文中都被认为是正确的;出于类似但不太严重的原因,我不喜欢if(foo != NULL)和if(foo == NULL)的指针;因为这不能与TRUE相比引入错误,所以这只是一个口味问题,但是使用if(foo)和if(!foo)作为任何标量值更符合C 语言的外观和感觉
标签: c coding-style