我很想知道如何在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 ..)
会变得很棘手那么它是如何真正落后的?实现是否可能依赖于条件的布尔运算?
答案 0 :(得分:4)
我很想知道如何在C / C ++或其他编程语言中实现条件语句,例如“if”。
这取决于您的计算机的汇编语言。例如,对于x86指令列表,指令CMP
将设置一个标志,该标志由J**
(JNE
,JA
,......等指令读取。
这通常是“实施”条件的方式。
在第二种方式中,首先评估所有陈述,然后对其结果应用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结果是一个布尔。如果计算第二个表达式,则在每个值计算和与之相关的副作用之前,对与第一个表达式相关联的每个值计算和副作用进行排序。 第二个表达。
其他事实 - 编译器是否遵守规则。