Tengo una pregunta sobre cómo el compilador evalúa la condición 'Y' en c.
Digamos, escribo una declaración como
if( (today is Thursday) && (Month is July) ) { //do something }Suponga que hoy no es jueves, pero el mes es julio.
¿El compilador verifica ambas condiciones y hace 1&0 == 0? O tan pronto como ve que hoy no es jueves, simplemente se salta y ni siquiera se molesta en verificar la condición Mes, ya que es intrascendente.
estoy usando el siguiente 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)De acuerdo con el Estándar C (6.5.13 Operador lógico AND)
4 A diferencia del operador & binario bit a bit, el operador && garantiza una evaluación de izquierda a derecha; si se evalúa el segundo operando, hay un punto de secuencia entre las evaluaciones del primer y segundo operando. Si el primer operando se compara igual a 0, el segundo operando no se evalúa.
En cuanto al operador OR lógico (6.5.14 Operador OR lógico), entonces
4 A diferencia de bit a bit | operador, el || el operador garantiza la evaluación de izquierda a derecha; si se evalúa el segundo operando, hay un punto de secuencia entre las evaluaciones del primer y segundo operando. Si el primer operando se compara distinto de 0, el segundo operando no se evalúa .
Como otros ya han dicho, && es un operador de cortocircuito que, en el caso de && , finalizará la evaluación tan pronto como se conozca el resultado (lo que sucede cuando se pasa a L-> cualquier operando se evalúa como cero/falso, lo cual es una condición suficiente para detener la evaluación posterior) desde 0 && a = 0)
En breve su pseudo-código:
if( (today is Thursday) && (Month is July) ) { //do something }es equivalente a esto:
if (today is Thursday) { if (Month is July) { //do something } }El operador && cortocircuita bajo C. Esto significa que si la primera condición evaluada falla y es suficiente para decidir el resultado de la expresión, terminará allí.