Semántica de `printf (” … “) || printf (“…”) || printf (“…”) `

Me pregunto qué imprimirá la siguiente statement en C?

printf("hello\n") || (printf("goodbye\n") || printf("world\n")); 

Normalmente estoy acostumbrado a usar “cout” para imprimir algo en C. También estoy confundido acerca de la tubería y los operadores de doble tubería utilizados de esta manera. ¡Gracias!

Primero, cout es un invento de C ++, nunca regresó a C, y nunca lo hará.

A continuación, printf devuelve el número de caracteres impresos, por lo que la primera llamada devuelve un valor distinto de cero.

Como || es un cortocircuito booleano o no se realizará ninguna de las siguientes llamadas a printf .

( | es bitwise o, y por lo tanto no es cortocircuito. Se agrega porque se está hablando de tuberías individuales y @Leeor vinculó esa pregunta).

Resultado final: hello\n se imprime: 5 caracteres + nueva línea (se traducirá, ya que stdin es modo texto (transformación de identidad en Unixoids)).

7.21.6.3 La función printf

Sinopsis

 #include  int printf(const char * restrict format, ...); 

Descripción
2 La función printf es equivalente a fprintf con el argumento stdout interpuesto antes de los argumentos para printf .
Devoluciones
3 La función printf devuelve el número de caracteres transmitidos, o un valor negativo si se produce un error de salida o de encoding.

6.5.12 Operador OR inclusivo bit a bit

Sinopsis
[…]
Restricciones
2 Cada uno de los operandos tendrá tipo entero.
Semántica
3 Las conversiones aritméticas habituales se realizan en los operandos.
4 El resultado de la | operador es el OR inclusivo a nivel de bit de los operandos (es decir, cada bit en el resultado se establece si y solo si se establece al menos uno de los bits correspondientes en los operandos convertidos).

6.5.14 Operador OR lógico

Sinopsis
[…]
Restricciones
2 Cada uno de los operandos tendrá tipo escalar.
Semántica
3 El || el operador producirá 1 si cualquiera de sus operandos se compara desigual con 0; de lo contrario, arroja 0. El resultado tiene tipo int .
4 A diferencia del bitwise | 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 operandos. Si el primer operando se compara de manera desigual con 0, el segundo operando no se evalúa.

Se imprimirá:

hello\n (es decir, hola y una nueva línea, no el literal “\ n”.)

printf devuelve el número de caracteres impresos en la consola. El || es un cortocircuito “o”, que significa: hacer lo primero, luego, si lo primero que se devuelve “falso”, hacer lo siguiente. Al final, regresa si alguna de las cosas que hiciste devolvió “verdadero”.

En c, un int se considera “verdadero” si es cualquier valor distinto de 0, y las tres llamadas de printf imprimen más de 0 caracteres, por lo que ejecutará el primero, que devuelve (un valor lógicamente equivalente a) verdadero , así que detendrá la ejecución de esa línea y pasará a la siguiente.

Por supuesto, no hay razón para escribir código así … a veces hay razones para usar operadores booleanos de corto circuito con funciones que tienen efectos secundarios (como imprimir en la consola), pero no puedo pensar en una razón. alguna vez necesitarías hacer un cortocircuito donde las funciones a las que llamabas se pasaran por constantes y siempre sabrás exactamente qué resultado obtendrías de ellas.

También, sí, como está escrito, hay un error de comstackción debido a un paréntesis abierto adicional antes de su segunda impresión. Pero ignorando eso.

¡Imprime “hola” solamente!

http://www.compileonline.com/compile_c_online.php

 #include  #include  main() { printf("hello\n") || (printf("goodbye\n") || printf("world\n")); }