C 设计if-else语句关于语法的几个问题
我在c89模式下使用GCC4.7.0 我有这个if-else语句,有两个问题C 设计if-else语句关于语法的几个问题,c,C,我在c89模式下使用GCC4.7.0 我有这个if-else语句,有两个问题 我只是想知道我应该先测试假条件还是真条件。通常更好的。我知道这没有多大区别,但我只是想知道其他工程师做什么?在下面的示例中,我首先检查是否存在错误 我总是喜欢做一些防御性的编程。因此,如果我能显式地检查每个条件,我总是这样做。例如,而不是执行if()-else。我会做if()-否则if()。在下面的示例中,条件可以是TRUE或FALSE。然而,我总是喜欢检查else条件以确保它是真实的。这有什么真正的意义吗 非常感谢你
if(event->status == FALSE) {
g_release_call_test(module, channel_id);
}
else if(event->status == TRUE) {
if(UNIT_TEST & KARAOKE) {
if(g_record_karaoke(module, channel_id) == FALSE) {
g_release_call_test(module, channel_id);
}
}
else if(UNIT_TEST & RECORD) {
if(g_record_file_test(module, channel_id) == FALSE) {
g_release_call_test(module, channel_id);
}
}
else if(UNIT_TEST & GET_DIGITS) {
if(g_collect_digits_test(module, channel_id) == FALSE) {
g_release_call_test(module, channel_id);
}
}
}
1)我只是想知道我应该先测试假条件还是真条件。是什么
通常更好。我知道这没有多大区别,但我只是想知道其他工程师做什么?在下面的例子中,我是
首先检查是否存在错误。
从语法上讲,这没有多大区别,编程方面的问题通常也不重要。但是,对于特定用例,它可能会影响性能。让我们考虑一个例子,如果你正在播放一个媒体文件,这个条件是检查它是一个媒体帧还是头文件。在这里,您知道在报头之后将有100个媒体帧,因此您需要先检查媒体帧,然后检查报头。因为检查头意味着100个冗余检查==100个冗余CPU指令[可能更多]。除非您编写的是一般性的东西,否则最好根据您的用例编写代码
2)我总是喜欢做一些防御性的编程。因此,如果我能显式地检查每个条件,我总是这样做。例如,而不是执行if()-else。我会做if()-否则if()。在下面的示例中,条件可以是TRUE或FALSE。然而,我总是喜欢检查else条件以确保它是真实的。这有什么实际意义吗?
防御性编程有其利弊。在上述场景中,编译器将为您进行必要的优化
你可能想看看这里
干杯。。
快乐学习我只是想知道我应该先测试错误的还是真实的条件。是什么
通常更好。我知道这没有多大区别,但我只是想知道其他工程师做什么?在下面的例子中,我是
首先检查是否存在错误。
从语法上讲,这没有多大区别,编程方面的问题通常也不重要。但是,对于特定用例,它可能会影响性能。让我们考虑一个例子,如果你正在播放一个媒体文件,这个条件是检查它是一个媒体帧还是头文件。在这里,您知道在报头之后将有100个媒体帧,因此您需要先检查媒体帧,然后检查报头。因为检查头意味着100个冗余检查==100个冗余CPU指令[可能更多]。除非您编写的是一般性的东西,否则最好根据您的用例编写代码
2)我总是喜欢做一些防御性的编程。因此,如果我能显式地检查每个条件,我总是这样做。例如,而不是执行if()-else。我会做if()-否则if()。在下面的示例中,条件可以是TRUE或FALSE。然而,我总是喜欢检查else条件以确保它是真实的。这有什么实际意义吗?
防御性编程有其利弊。在上述场景中,编译器将为您进行必要的优化
你可能想看看这里
干杯。。
快乐学习1)先检查哪个条件并不重要,因为编译器会为您优化代码
2) 如果status
只能有两个值(TRUE/FALSE
),那么对于普通读者来说,拥有一个else if
似乎有点困惑。另一方面,如果status
可以有其他值,那么第三个else部分可以使用assert()
。一般来说,添加断言是一个好习惯,可以添加到防御工具箱中以捕获错误的假设。1)首先检查哪种条件无关紧要,因为编译器将为您优化代码
2) 如果
status
只能有两个值(TRUE/FALSE
),那么对于普通读者来说,拥有一个else if
似乎有点困惑。另一方面,如果status
可以有其他值,那么第三个else部分可以使用assert()
。一般来说,添加断言是一个好习惯,可以添加到防御工具箱中以捕获错误的假设。首先,不要对布尔值执行此操作:
if (something == TRUE)
if (something == FALSE)
这些应该是:
if (something)
if (!something)
def fn (x):
if (x < MIN_X_ALLOWED):
return -1
# Now carry on, knowing that x >= MIN_X_ALLOWED.
布尔值也应该智能命名,以便if
语句能够自然读取,例如if(isFinished)
或while(stillSomeMoreToGo)
status
不是布尔值的好名字,除非它是用来表示某个东西有状态,即使这样,我也会使用hasStatus
或类似的名称
在任何情况下,C中的某些内容都可能是真的,即使它不等于您的true
值TRUE
必然是一个值,而C将非零值定义为TRUE(232-1个不同的可能值,当然这取决于您的int
规范)
显式测试true或false是一个坏主意,因为这样做只会生成另一个布尔值,您在哪里停止
if ((event->status == TRUE) == TRUE) ...
if (((event->status == TRUE) == TRUE) == TRUE) ...
if ((((event->status == TRUE) == TRUE) == TRUE) == TRUE) ...
if (((((event->status == TRUE) == TRUE) == TRUE) == TRUE) == TRUE) ...
就您的具体问题而言,对于(1),从性能的角度来看,这可能不会有任何区别。然而,有时它会影响代码的可读性。选择提供“预处理”的方法