在CC++中,使用布尔运算符短路控制流是否安全而不使用计算的布尔值?

在CC++中,使用布尔运算符短路控制流是否安全而不使用计算的布尔值?,第1张

概述一段继承代码中的重复模式是,只要其中一个函数返回某个值,就会调用一系列函数并中止链.然后该值应用于后续计算.为了演示,破坏值为0.请考虑以下程序: #include <stdio.h>static int n;static int foo(int x){ fprintf(stderr, "%d(%d) ", x, n++); return x ? 0 : n;}st 一段继承代码中的重复模式是,只要其中一个函数返回某个值,就会调用一系列函数并中止链.然后该值应用于后续计算.为了演示,破坏值为0.请考虑以下程序:

#include <stdio.h>static int n;static int foo(int x){    fprintf(stderr,"%d(%d) ",x,n++);    return x ? 0 : n;}static voID with_if(voID){    int rc;    n = 0;    do {        if( (rc = foo(1)) ) break;        if( (rc = foo(2)) ) break;        if( (rc = foo(3)) ) break;        if( (rc = foo(4)) ) break;        if( (rc = foo(0)) ) break;        if( (rc = foo(5)) ) break;    } while(0);    fprintf(stderr,">>%d<<\n",rc);}voID with_short_circuit(voID){    int rc;    n = 0;       (rc = foo(1))    || (rc = foo(2))    || (rc = foo(3))    || (rc = foo(4))    || (rc = foo(0))    || (rc = foo(5));    fprintf(stderr,rc);}int main(int argc,char *argv[]){    with_if();    with_short_circuit();    return 0;}

请注意,短路变体不仅更简洁,它(IMHO)也更容易阅读和推理,因为在阅读该代码时,您不必将所有其他周围语句推入您的心理堆栈.所以我大多喜欢短路的变种.

就GCC-4.9.3和Clang-3.6.2而言,with_if和with_short_circuit是相同的(它们产生相同的汇编输出).

我担心的是,布尔运算符链的结果被忽略(如果用-Wall GCC编译发出关于它的警告,Clang仍保持沉默)并且这可能被视为优化的机会.当然调用foo会产生副作用,因此在我对C语言标准的理解中应该可以安全地使用布尔短路来控制流程.有点我不太确定.

解决方法 这被称为“丢弃值表达式”,必须进行评估:

N4296,5§11:

In some contexts,an Expression only appears for its sIDe effects. Such an Expression is called a discarded-value Expression. The Expression is evaluated and its value is discarded.

总结

以上是内存溢出为你收集整理的在C/C++中,使用布尔运算符短路控制流是否安全而不使用计算的布尔值?全部内容,希望文章能够帮你解决在C/C++中,使用布尔运算符短路控制流是否安全而不使用计算的布尔值?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1216759.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存