How the compiler evaluates and condition in c

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

Let's say I write an expression like

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

      

Suppose today is not Thursday, but the month of July.

Does the compiler check for both and do 1 & 0 == 0? Or, as soon as he sees that today is not Thursday, he just slips and does not even bother checking the state of the month, since this is irrelevant.

I am 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) 

      

+3


source to share


4 answers


According to the C standard (6.5.13 logical AND operator)

4 Unlike bitwise binary and operator, the && operator guarantees an evaluation from left to right; if the second operand is evaluated, the sequence point is between the evaluations of the first and second operands. If the first operand is compared to 0, the second operand is not evaluated.



Regarding the logical OR operator (6.5.14 Logical OR operator), then

4 Unlike bitwise | operator, || operator guarantees from left to right; if the second operand is evaluated, the sequence point is between the evaluations of the first and second operands. If the first operand is compared non-0, the second operand is not evaluated .

+6


source


The operator short-circuits &&

under C. This means that if the first condition evaluates with an error, and it is sufficient to decide which result of the expression it will terminate there.



+1


source


As others have said, && is a short-circuit operator, which in case will &&

stop evaluating as soon as the result is known (which happens when L-> transitions any operand evaluates to zero / false, which is a sufficient condition to stop further evaluation, since 0 && a = 0)

Soon your pseudocode:

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

      

is equivalent to this:

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

      

+1


source


using this diagram:

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

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

As soon as the expression "false" occurs in & &, the "shortcuts" are executed from the rest of the evaluation.

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

0


source







All Articles