52 votes

Qu'est-ce que cette expression signifie, et pourquoi faut-il compiler?

Après une faute de frappe, l'expression suivante (simplifié) compilé et exécuté:

    if((1 == 2) || 0 (-4 > 2))
      printf("Hello");

bien sûr, le 0 ne devrait pas être là.

Pourquoi faut-il compiler, et que signifie l'expression signifie?

L'original (simplifié) devrait ressembler à ceci:

    if((1 == 2) || (-4 > 2))
      printf("Hello");

rien de tout cela ne compile:

    if((1 == 2) || true (-4 > 2))
      printf("Hello");

    if((1 == 2) || 1 (-4 > 2))
      printf("Hello");

    if((1 == 2) || null (-4 > 2))
      printf("Hello");

26voto

Rup Points 17863

Il semble que ce est un Visual C++ extension d'un particulier de "pas de fonction définie à l'' idiome. À partir de l' avertissement C4353 page:

// C4353.cpp
// compile with: /W1
void MyPrintf(void){};
#define X 0
#if X
   #define DBPRINT MyPrint
#else
   #define DBPRINT 0   // C4353 expected
#endif
int main(){
    DBPRINT();
}

le but étant que, DBPRINT est un no-op. L'avertissement suggère #define DBPRINT __noop au lieu de cela, à l'aide de VC __noop extension de la place.

Si vous affichez l'assemblée de référencement de votre sortie, vous verrez la deuxième clause est omise, même en mode de débogage.

14voto

Lorinczy Zsigmond Points 149

Suppose qu'il a été interprété comme

if((1 == 2) || NULL (-4 > 2))
  printf("Hello");

où la valeur NULL est une fonction de pointeur, par défaut de retour de type int... Ce qui au qui se passe réellement dans runtime est dépend de la plateforme

9voto

Remco Boom Points 111

Visual Studio 2012 vous donne l'avertissement suivant:

avertissement C4353: extension non standard utilisé: constante 0 comme expression de fonction. Utiliser '__noop' fonction intrinsèque à la place

c'est une façon non standard pour insérer un "non fonctionnement" instruction assembleur à ce stade de l'évaluation de l'expression

8voto

Pierre Fourgeaud Points 10249

En fait, c'est Microsoft.

Pour le débogage, vous pouvez utiliser __noop intrinsèque, il indique que la fonction et les paramètres ne seront pas évalués.

Dans votre cas, le compilateur de Microsoft pense que vous essayez d'utiliser de 0 à en faire de même, c'est pourquoi cela fonctionne, mais par exemple, sur VS2012 il donne cet avertissement :

warning C4353: nonstandard extension used: constant 0 as function expression.  Use '__noop' function intrinsic instead.

Voir ce pour plus d'informations : http://msdn.microsoft.com/en-us/library/2a68558f(v=vs. 71).aspx

1voto

pradipta Points 1007

Dans ubuntu, il montre l'erreur

int main()
{
 if((1 == 2) || 0 (-4 > 2))
      printf("Hello");
}

o/p

niew1.c:3:19: error: called object â0â is not a function

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