如何在C / C ++中实现条件?

时间:2013-06-06 16:37:52

标签: c++ c if-statement implementation

我很想知道如何在C / C ++或其他编程语言中实现条件语句,例如“if”。

因此,如果我用以下两种方式编写if语句,它将如何在计算成本方面产生差异:

方式I:

if(statement1)
    return true;
if(statement2)
    return true;
if(statement3)
    return true;

方式II:

if(statement1 || statement2 || statement3)
    return true;

在第二种方式中,首先评估所有陈述,然后对其结果应用OR操作,或者首先将OR操作识别为认知,然后一旦任何陈述评估为真,真实值应为回?后者通过不必必须评估条件中的每个语句来节省计算成本/时间,因为只要它获得第一个真,就完成了工作。 但这取决于条件内的操作。如果它是一个AND,它就会变成一个不同的情况。使用组合操作(AND + OR + XOR ..)

会变得很棘手

那么它是如何真正落后的?实现是否可能依赖于条件的布尔运算?

6 个答案:

答案 0 :(得分:4)

  

我很想知道如何在C / C ++或其他编程语言中实现条件语句,例如“if”。

这取决于您的计算机的汇编语言。例如,对于x86指令列表,指令CMP将设置一个标志,该标志由J**JNEJA,......等指令读取。

这通常是“实施”条件的方式。

  

在第二种方式中,首先评估所有陈述,然后对其结果应用OR操作,或者首先将OR操作识别为认知,然后一旦任何陈述评估为真,真实值应为回?

在C中,&&||二元运算符使用短路评估。也就是说,在E1 || E2中,如果E1为真,则不会评估E2

答案 1 :(得分:2)

  

在第二种方式中,首先评估所有陈述,然后对其结果应用OR操作,或者首先将OR操作识别为认知,然后一旦任何陈述评估为真,真实值应为回?

逻辑运算符总是在C ++中短路。在||的情况下,如果第一个操作数为true,则不计算第二个操作数。这意味着你的两个例子应该是等价的;代码将评估表达式,直到一个为真,然后返回true。

这不仅可以更有效地总是评估两者;它也允许像

这样的东西
if (!p || *p == whatever)

如果第一个是真的,那么评估第二个是错误的。

  

如果它是一个AND,它就会变成一个不同的情况。

在这种情况下,仅在第一个操作数为false时才评估第二个操作数。

  

使用组合操作(AND + OR + XOR ..)

会变得很棘手

C ++中没有逻辑XOR;仅限&&||。将它们组合起来相当简单; &&具有更高的优先级,并且在每个子表达式中,操作数从左到右进行评估,根据需要进行短路。

答案 2 :(得分:2)

实现依赖于编译器和优化设置 。在某些情况下,Way II(具有OR条件的那个)由于“短路”而更快:如果||左侧的操作数运算符为true,不检查其余条件。另一方面,在方式I中,条件是顺序排列的 - 除非使用某种优化(或智能编译器)将其转换为方式II(在这种情况下两种方式同样快)。

答案 3 :(得分:1)

取决于编译器。你可以看到使用gcc -o会发生什么,它将生成一个目标文件。打开目标文件,你会看到编译器优化它。通常,它会创建一个跳转表(对于长条件),但有时它只使用条件处理器指令。

答案 4 :(得分:1)

智能编译器会将Way I转换为Way II。

Way II检查每个语句,并在遇到真相后立即返回true。

答案 5 :(得分:1)

根据标准:


5.15逻辑OR运算符

   logical-or-expression:
     logical-and-expression
     logical-or-expression || logical-and-expression

1 ||操作员组从左到右。操作数都在上下文中转换为bool(第4条)。如果其任一操作数为true,则返回true,否则返回false。与|,||不同保证从左到右 评价;此外,如果第一个操作数的计算结果为true,则不计算第二个操作数。

2结果是一个布尔。如果计算第二个表达式,则在每个值计算和与之相关的副作用之前,对与第一个表达式相关联的每个值计算和副作用进行排序。 第二个表达。


其他事实 - 编译器是否遵守规则。