Tag: 短路

编译器如何评估C中的条件

我有一个关于编译器如何评估c中“AND”条件的问题。 说,我写一个声明就像 if( (today is Thursday) && (Month is July) ) { //do something } 假设今天不是星期四,但月份确实是七月。 编译器是否检查两个条件,并执行1&0 == 0? 或者,一旦它看到今天不是星期四,它就会跳出来,甚至懒得查看月份状况,因为它无关紧要。 我正在使用以下gcc Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v –with-pkgversion=’Ubuntu/Linaro 4.6.3-1ubuntu5′ –with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs –enable-languages=c,c++,fortran,objc,obj-c++ –prefix=/usr –program-suffix=-4.6 –enable-shared –enable-linker-build-id –with-system-zlib –libexecdir=/usr/lib –without-included-gettext –enable-threads=posix –with-gxx-include-dir=/usr/include/c++/4.6 –libdir=/usr/lib –enable-nls –with-sysroot=/ –enable-clocale=gnu –enable-libstdcxx-debug –enable-libstdcxx-time=yes –enable-gnu-unique-object –enable-plugin –enable-objc-gc –disable-werror […]

C中的优先与短路

int i=-3, j=2, k=0, m; m = ++i || ++j && ++k; printf(“%d, %d, %d, %d\n”, i, j, k, m); 因为++优先级高于|| 和&&在C中,首先评估它们,因此表达式变为m = -2 || 3 && 1 m = -2 || 3 && 1 。 现在你可以应用短路但产生错误的答案。 这是为什么?

为什么C中的逻辑运算符在没有必要的时候不会评估整个表达式?

我正在阅读我的计算机体系结构课程的教科书,我发现了这个声明。 逻辑运算符’ && ‘和’ ||之间的第二个重要区别 ‘与他们的比特级对手’ & ‘和’ | ‘如果可以通过计算第一个参数来确定表达式的结果,那么逻辑运算符不会计算它们的第二个参数。 因此,例如,表达式a && 5/a将永远不会导致除零,而表达式p && *p++将永远不会导致空指针的解除引用。 (计算机系统:由Bryant和O’Hallaron撰写的程序员观点,第3版,第57页) 我的问题是为什么C中的逻辑运算符表现如此? 使用作者的a && 5/a的例子,C不需要评估整个表达式,因为&&要求两个谓词都是真的吗? 不失一般性,我的同样问题适用于他的第二个例子。

用C语言中的++运算符对语句进行短路评估

我在Windows 7上的Code :: Blocks 10.05中执行了以下代码。 int a=0,b=0,c; c=a++&&b++; printf(“\na=%d\nb=%d\nc=%d\n\n”,a,b,c); 我获得的输出如下, a=1 b=0 c=0 由于短路评估,这非常有意义。 表达式a++是后递增, 0是返回逻辑和( && )。 因此,不评估部分b++因为0 && 0和0 && 1计算为0 。 但这引起了我的怀疑。 运算符的优先级值清楚地表明++具有比&&更高的优先级。 所以我的理解是这样的,对a++和b ++都进行了评估,然后&&只检查表达式a++的结果来做出决定。 但这并没有发生只有这里评估a++ 。 这种行为的原因是什么? &&作为序列点是否与此行为有关? 如果是这样,为什么我们说&&优先级低于++ ?

基于短路逻辑运算的条件执行

作为逻辑运算符&&和||的评估 被定义为“短路”,我假设以下两段代码是等价的: p = c || do_something(); 和 if (c) { p = true; } else { p = do_something(); } 给定p和c是bool , do_something()是一个返回bool并可能有副作用的函数。 根据C标准,可以依靠假设片段是等效的吗? 特别是,拥有第一个片段,是否承诺如果c为真,则不会执行该function,并且不会产生副作用?

使用&& ||进行短路评估 操作者

我知道什么是C中的短路评估。 a && b (如果a = 0,则不检查操作数b) a || b a || b (如果a =非零,则不检查操作数b) 但是我坚持这个问题 int x = 0; if (5 || 2 && ++x) printf(“%d”, x); 输出0 。 我的第一个想法如下: 根据优先级表,优先级是++ , && , || (降序排列) ++x : evaluated.x成为1。 2 && ++x评估。 两个操作数都被评估。 || 被评估。 但据此,应该打印1 ,而不是0 。 我的第二个想法是: 5 || anything 由于短路评估, anything都没有被评估,因此这里没有优先权。