#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++中,使用布尔运算符短路控制流是否安全而不使用计算的布尔值?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)