¿Es este condicional ternario?: ¿Sintaxis correcta (Objetivo) C?

3 minutos de lectura

No pensé que esto fuera posible, pero aparentemente en Objective C está permitido:

int a = b ?: c;

Así que ven lo que están haciendo aquí, están omitiendo la segunda parte de la expresión ternaria, de modo que si b no es cero, b se usa como la segunda parte.

Es inteligente, pero que yo sepa, esto va en contra de K&R C, y probablemente ANSI C.

Si no, me he estado perdiendo un truco de sintaxis terriblemente inteligente durante años… ¡ay!

Actualización: es gcc.

  • ¿Qué compilador? GCC tiene esto como una extensión, aunque obsoleta.

    – KerrekSB

    6 de enero de 2012 a las 15:57


  • El término más correcto es condicional. Ternario solo significa que es un operador que toma 3 argumentos.

    – pubis

    6 de enero de 2012 a las 16:05

avatar de usuario
Joachim Isaksson

Desde http://en.wikipedia.org/wiki/%3F%3A

Una extensión GNU a C permite omitir el segundo operando y usar implícitamente el primer operando como el segundo también:

a = x ? : y;

La expresión es equivalente a

a = x ? x : y;

excepto que si x es una expresión, se evalúa solo una vez. La diferencia es significativa si evaluar la expresión tiene efectos secundarios.

avatar de usuario
steven pescador

Este comportamiento está definido para ambos gcc y clang. Si está compilando código macOS o iOS, no hay motivo no para usarlo

Sin embargo, no lo usaría en código portátil sin considerarlo cuidadosamente.

$ cat > foo.c
#include <stdio.h>

int main(int argc, char **argv)
{
  int b = 2;
  int c = 4;
  int a = b ?: c;
  printf("a: %d\n", a);
  return 0;
}
$ gcc -pedantic -Wall foo.c
foo.c: In function ‘main’:
foo.c:7: warning: ISO C forbids omitting the middle term of a ?: expression

Así que no, no está permitido. Lo que emite gcc en este caso hace esto:

$ ./a.out 
a: 2

Entonces, el comportamiento indefinido está haciendo lo que dice en su pregunta, aunque no quiera confiar en eso.

  • No me gusta tu uso de la palabra “indefinido” aquí. Sería mejor llamarlo no estándar; el comportamiento ES definido para GCC, pero no para ISO C. Eso lo hace indefinido para otros compiladores y no portátil, pero aún está definido para GCC.

    –Steven Fisher

    18 de enero de 2012 a las 22:22


  • @steven Como la pregunta era si es la sintaxis correcta de C, entonces el hecho de que sea un comportamiento indefinido en C es la respuesta correcta, independientemente de lo que haga su compilador.

    usuario23743

    19 de enero de 2012 a las 10:47

avatar de usuario
sidilio

Esto es un Extensión GNU C. Verifique la configuración de su compilador (busque el sabor C). No estoy seguro si es parte de Clang, la única información que pude obtener está en esta página:

Introducción

Este documento describe las extensiones de idioma proporcionadas por Clang. Además de las extensiones de idioma enumeradas aquí, Clang tiene como objetivo admitir una amplia gama de extensiones GCC. Consulte el manual de GCC para obtener más información sobre estas extensiones.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad