C 设计if-else语句关于语法的几个问题

C 设计if-else语句关于语法的几个问题,c,C,我在c89模式下使用GCC4.7.0 我有这个if-else语句,有两个问题 我只是想知道我应该先测试假条件还是真条件。通常更好的。我知道这没有多大区别,但我只是想知道其他工程师做什么?在下面的示例中,我首先检查是否存在错误 我总是喜欢做一些防御性的编程。因此,如果我能显式地检查每个条件,我总是这样做。例如,而不是执行if()-else。我会做if()-否则if()。在下面的示例中,条件可以是TRUE或FALSE。然而,我总是喜欢检查else条件以确保它是真实的。这有什么真正的意义吗 非常感谢你

我在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),从性能的角度来看,这可能不会有任何区别。然而,有时它会影响代码的可读性。选择提供“预处理”的方法