Je ne pensais pas que c'était possible mais apparemment dans l'objectif C, il est autorisé:
int a = b ?: c;
Vous voyez donc ce qu'ils font ici, ils quittent la deuxième partie de l'expression ternaire, de sorte que si B est non nulero, B est utilisé comme deuxième partie.
C'est intelligent mais aussi loin que je sais que c'est contre K & R C et probablement Ansi C.
Sinon, je n'ai pas manqué d'un tour de syntaxe terriblement intelligent pendant des années ... Hélas!
MISE À JOUR: C'est GCC.
De - http://fr.wikipedia.org/wiki/%3f%3a
A GNU Extension à C permet d'omettre le deuxième opérande et d'utiliser implicitement le premier opérande comme deuxième également:
a = x ? : y;
L'expression est équivalente à
a = x ? x : y;
sauf que si x est une expression, elle est évaluée une seule fois. La différence est significative si l'évaluation de l'expression a des effets secondaires.
Ce comportement est défini pour les deux gcc
et clang
. Si vous construisez des macos ou du code iOS, il n'y a aucune raison non pour l'utiliser.
Je ne l'utiliserais pas dans le code portable, sans le considérer avec précaution.
Ceci est une rallonge GNU C . Vérifiez vos paramètres du compilateur (recherchez la saveur C). Je ne sais pas si cela fait partie de Clang, les seules informations que je pourrais obtenir sont dans cette page :
Introduction
Ce document décrit les extensions de langue fournies par Clang. Outre les extensions de langue énumérées ici, Clang vise à prendre en charge une large gamme d'extensions de GCC. Veuillez consulter le manuel de la GCC pour plus d'informations sur ces extensions.
$ 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
Donc non, ce n'est pas permis. Ce que GCC émet dans ce cas cela:
$ ./a.out
a: 2
Donc, le comportement indéfini fait ce que vous dites dans votre question, même si vous ne voulez pas compter sur cela.