我想声明unsigned int是严格正的。我在以下两个选项之间进行辩论:
unsigned int i = 1;
assert(i > 0); /*option 1*/
assert(i != 0); /*option 2*/
我发现自己处于Buridan's ass两难境地。是否有理由更喜欢一个而不是另一个?
答案 0 :(得分:6)
assert(i > 0);
对于i
检查正整数并包括i = 0
的情况的其他程序员来说更具可读性。
注意:正如Joachim所指出的comment,如果在{{1}定义了宏NDEBUG
,请记住最后包含,宏assert()
不生成任何代码,因此根本不执行任何操作。
答案 1 :(得分:3)
我更喜欢
assert(i > 0); /*option 1*/
有两个原因。
首先,这是一个较少的角色,角色需要花钱。
其次,如果你的意图是显示数字是严格正数,即使不知道我是无符号整数,这也很清楚。
答案 2 :(得分:2)
两者肯定会生成相同的代码,因此无论如何传达整体功能的目标是更好的选择:
unsigned int i = ...;
assert(i > 0); /*option 1*/
assert(i != 0); /*option 2*/
选项1在大多数情况下效果更好,因为它是一个积极的断言:价值应该是什么,不应该是什么。通常这更容易理解。此外,当测试i
的算术性质时,这是可行的方法。
当i
仅用于零或非零时,选项2在有限的情况下效果更好 - 特别是如果它是算术值无关的逻辑位的集合。