43 votes

Pourquoi peut-int _$[:>=<%-!.0,}; compiler?

Aujourd'hui, j'ai trouvé étrange syntaxe comme

 int _$[:>=<%-!.0,};

dans certains vieux code, mais en fait, le code n'est pas commenté. Il semble y avoir aucun rapport d'erreurs de compilation pour cette ligne. Je l'ai testé séparément, et il permet de compiler trop:

int main(){
    int _$[:>=<%-!.0,};
    return 0;
}

Pourquoi ne peut-il remplir?

47voto

Yu Hao Points 40603

Avec le Digraphe (voir ci-dessous), la ligne est convertie:

int _$[]={-!.0,};

Sur le côté droit, .0 est le double littérale, ! est la négation logique de l'opérateur, - est arithmétique de l'opérateur de négation, et , est la virgule. Ensemble {-!.0,} est un initialiseur de tableau.

La gauche, en int _$[] définit une int tableau. Cependant, il y a un dernier problème, _$ n'est pas un identificateur valide dans la norme C. Certains compilateurs (e.g, gcc) soutient l'extension.


C11 §6.4.6 Punctuators

Dans tous les aspects de la langue, les six jetons

<: :> <% %> %: %:%:

se comportent, respectivement, de même que les six jetons

[  ]  {  }  #  ##

38voto

dcow Points 2921

Eh bien,

  • trait de soulignement _ est un identificateur de caractère,
  • signe de dollar $ est autorisée dans certaines implémentations de trop,
  • crochet gauche [ indique le type de tableau,
  • :> est le bigramme pour ],
  • est égal à = est d'affectation,
  • <% est le bigramme pour {,
  • -!.0 est juste -1 (.0 est un double littérale 0.0, ! implicitement jette à l' (int) 0 et logiquement inverse, et - est négatif),
  • vous pouvez avoir des virgules dans les initialiseurs de tableau {1, (2, 3,)},
  • et ; termine la déclaration.,

Ainsi, vous obtenez

int _$[] = {-1,};

11voto

Nayuki Minase Points 3545

Cela fonctionne en raison de bigrammes en C. La ligne en question décode comme ceci:

int _$ [ :> = <% - ! .0  , } ;
int _$ [ ]  = {  - ! 0.0 , } ;

En outre:

  • .0 est double littérale.
  • ! est la négation Booléenne opérateur, alors !.0 rendements en (int) 1.
  • - est l'opérateur de négation unaire, qui rendements en (int) -1.
  • Une virgule est légal après un élément de tableau.

11voto

AndreyT Points 139512

Si l'on remplace les bigrammes :> et <% présent dans votre ligne de code, nous nous retrouvons avec

int _$[]={-!.0,};

ce qui est équivalent à

int _$[] = { -1, };

C'est une déclaration de tableau _$ de type int [1] avec un initialiseur.

Notez que ce n'est pas exactement de la garantie de compiler depuis la norme du langage C n'est pas immédiatement fournir un soutien pour l' $ personnage dans indentifiers. Il permet des implémentations d'étendre l'ensemble des prises en charge charaters bien. Apparemment, le compilateur vous avez utilisé appuyé $ dans les identificateurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X