web-dev-qa-db-fra.com

Est-ce que ce ternaire conditionnel ?: Syntaxe C correcte (objectif) C?

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.

41
user945620

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.

73
Joachim Isaksson

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.

7
Steven Fisher

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.

1
sidyll
$ 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.

1
user23743