Question

Je suis tombé sur ce programme C ++ bizarre.

#include <iostream>
using namespace std;
int main()
{
  int a = ({int x; cin >> x; x;});
  cout << a;
}

Quelqu'un peut-il expliquer ce qui se passe? Qu'est-ce que cette construction appelée?

Était-ce utile?

La solution

Il attribue une valeur d'entrée utilisateur à a et l'imprime sur. il se fait à l'aide d'un Statement Expression.

Expressions STATEMENT ne sont gnu gcc extension de compilateur ne sont pas pris en charge par les normes de C / C. Par conséquent, tout le code qui utilise l'expression de déclaration est conforme non standard et non portable.

Le IBM XL C / C ++ v7.0 également en charge les expressions Déclaration et ce de doccumentation les explique avec justesse:

Expressions Déclaration:

Une instruction composée est une séquence d'instructions jointes par des entretoises. Dans GNU C, une instruction composée entre parenthèses à l'intérieur peut apparaître comme une expression dans ce qu'on appelle un Statement expression.

         .--------------.
         V              |
>>-(--{----statement--;-+--}--)--------------------------------><

La valeur d'une expression de déclaration est la valeur de la dernière expression simple à apparaître dans toute la construction. Si la dernière déclaration n'est pas une expression, la construction est de type void et n'a pas de valeur.

Compiler toujours votre code en sélectionnant un sandard dans GCC, utilisez l'une des options -ansi, -std=c90 ou -std=iso9899:1990, -std=c++03, -std=c++0x; pour obtenir tous les diagnostics requis par la norme, vous devez également spécifier -pedantic (ou -pedantic-errors si vous voulez qu'ils soient des erreurs plutôt que des avertissements)

Autres conseils

Il est une extension de GCC. Compiler votre code avec le drapeau de -pedantic si vous voulez vous débarrasser des trucs comme ça (et vous vraiment ne voulez).

Il crée un champ en ligne, déclare x en son sein, il lit à partir de l'entrée standard et l'ensemble de la déclaration évalue enfin x, qui est attribué à a.

L'opérateur virgule fonctionne de façon similaire, même si elle ne nécessite pas un champ distinct. Par exemple:

int x;
int a = (cin >> x, x);

ferait la même chose. Toutes les instructions reliées par des virgules seront exécutées séquentiellement, et le résultat de l'ensemble de l'expression seront mis à la valeur de l'opérande à droite.

Je ne crois pas que ce soit la norme C ++. Il est probablement une extension spécifique à compilateur qui permet une portée intérieure d'évaluer à une valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top