82 votes

Pourquoi la déclaration "2i;" PAS causer une erreur de compilation?

Au lieu de , j’ai négligemment écrit :

Je m’attendais au compilateur d’intercepter l’erreur. Mais il ne l’a pas fait. Est donc `` une déclaration valable en C ? Si oui quoi sert-il ? Perplexe !

J’ai compilé avec gcc version 5.3.0 et voici le résultat de l’assemblage :

107voto

iharob Points 35087

Il s’agit d’une extension de la gcc , et `` est la constante imaginaire enter image description here. Donc vous pouvez écrire un nombre complexe comme suit :

13voto

chqrlie Points 17105

2i est gcc extension d'un complexe entier littéral, un imaginaire pur numéro deux fois la racine carrée de l' -1. Cette extension est prise en charge par clang .

Il est assez surprenant que votre compilation avec gcc 5.4.0 produit le posté assemblée de sortie:

  • Compilation sur http://gcc.godbolt.org/# j'obtiens une erreur de compilation à partir de gcc 5.3.0: http://gcc.godbolt.org/#: error: cannot convert '__complex__ int' to 'int' in return.
  • Posté le code assembleur de la fonction foo est incorrect: il ne renvoie pas d' 0. La conversion du complexe entier constant 2i de int doit retourner sa partie réelle 0.

À l'inverse, clang 3.7, il compile sans avertissement et génère optimale de code, mais bien sûr pas ce que vous attendez:

foo(int):                       # @foo(int)
    xorl    %eax, %eax
    retq

Cette syntaxe peut être combiné avec d'autres suffixes dans n'importe quel ordre. En compilant le code ci-dessous avec clang -Weverything donne-moi des mises en garde appropriées warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]:

#include <stdio.h>

int main() {
    /* complex integer literals */
    printf("sizeof(2i) = %zd\n", sizeof(2i));
    printf("sizeof(2ui) = %zd\n", sizeof(2ui));
    printf("sizeof(2li) = %zd\n", sizeof(2li));
    printf("sizeof(2lli) = %zd\n", sizeof(2lli));
    /* complex floating point literals */
    printf("sizeof(2.i) = %zd\n", sizeof(2.i));
    printf("sizeof(2.fi) = %zd\n", sizeof(2.fi));
    printf("sizeof(2e0fi) = %zd\n", sizeof(2e0fi));
    printf("sizeof(2e0i) = %zd\n", sizeof(2e0i));
    /* alternate order */
    printf("sizeof(2il) = %zd\n", sizeof(2il));
    printf("sizeof(2ill) = %zd\n", sizeof(2ill));
    printf("sizeof(2.if) = %zd\n", sizeof(2.if));

    return 0;
}

Il produit de cette sortie dans mon environnement:

sizeof(2i) = 8
sizeof(2ui) = 8
sizeof(2li) = 16
sizeof(2lli) = 16
sizeof(2.i) = 16
sizeof(2.fi) = 8
sizeof(2e0fi) = 8
sizeof(2e0i) = 16
sizeof(2il) = 16
sizeof(2ill) = 16
sizeof(2.if) = 8

Essayez la dernière avec votre coloration de la syntaxe de l'éditeur ;-)

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