简体   繁体   中英

How does the compiler evaluate a condition in C

I have a question regarding how the compiler evaluates 'AND' condition in c.

Say, I write a statement like

if( (today is Thursday) && (Month is July) )
{
 //do something
}

Assume today is not Thursday, but the Month is indeed July.

Does the compiler check both the conditions, and do 1&0 == 0? Or as soon as it sees that today is not Thursday, it just skips out and doesn't even bother to check the Month condition since it's inconsequential.

I'm using the following 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 --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 

According to the C Standard (6.5.13 Logical AND operator)

4 Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares equal to 0, the second operand is not evaluated.

As for the logical OR operator (6.5.14 Logical OR operator) then

4 Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares unequal to 0, the second operand is not evaluated .

As others have already said && is a short circuit operator which in case of && will terminate evaluation as soon as the result is known (which happens when going L-> any operand evaluates to to zero/false which is sufficient condition to cease further evaluation since 0 && a = 0)

Shortly your pseudo-code:

if( (today is Thursday) && (Month is July) )
{
 //do something
}

is equivalent to this:

if (today is Thursday)
{
    if (Month is July)
    {
        //do something
    }
}

&&运算符在C下短路。这意味着如果评估的第一个条件失败并且足以决定表达式的结果它将在那里终止。

using this chart:

http://www.swansontec.com/sopc.html

you will see that the && operator is evaluated from left to right.

Once a 'false' expression is encountered in a &&, the execution 'shortcuts' out of the rest of the evaluation.

So if the first expression is false, then the second expression is not evaluated

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM