2010-11-19 19 views
-2

Mon ami m'a envoyé une blague:"C - C++" blague sur le fonctionnement postfix/préfixe commande

Q. Quelle est la différence entre C et C++?

A. Rien, parce que: (C - C++ == 0)

j'ai essayé de changer l'ordre et est resté coincé.

Regardez ce code:

public class Test { 
    public static void main(String args[]) { 
     int c = 10;   
     System.out.println(c++ - c); 
     System.out.println(++c - c);   
    } 
} 

Pourquoi faut-il revenir:

-1 
0 

Je comprends postfix et l'incrément préfixe. Pourquoi n'est-ce pas le résultat?

0 
1 
+4

Code Posté est niether C++ ni C, s'il vous plaît ReTAG –

+2

Mec ... sin Quand est-ce que les blagues se sont entièrement conformées à la vérité? en pliant les règles, ils font quelque chose de drôle. Si vous voulez prendre cela littéralement, 'C - C++' est COMPORTEMENT UNDEFINED! – thecoshman

+3

@thecoshman: En C ou C++, il l'est, mais pas dans toutes les langues qui utilisent la syntaxe C-like. –

Répondre

10

Parce que dans le premier exemple, c commence 10. c++ incréments c et renvoie 10, de sorte que le deuxième c évalue maintenant à 11 depuis qu'il a été augmentée. Donc, l'expression ultime évaluée est 10 - 11, ce qui est égal à -1.

Dans le deuxième exemple, ++c incrémente à nouveau c mais renvoie 12 puisqu'il s'agit d'un pré-incrément. La deuxième c évalue également à 12, puisque c'est la nouvelle valeur stockée dans c. Ainsi, cette expression est finalement évalué comme 12 - 12, qui est égale à 0.

+0

Cette réponse est complètement fausse. Les deux exemples ont un comportement indéfini. –

+2

En Java? Êtes-vous sûr de cela? – cdhowie

1

La différence est dans les opérateurs que vous utilisez ++ C++ et c

C++ incrémente la valeur avant qu'il ne soit utilisé dans le calcul ++ c incrémente la valeur après il est utilisé dans le calcul

également la réponse de cdhowie explique mieux

1

Que ce soit en sortie 0 ou -1 pour la première println et 0 ou 1 pour le second est indéfini. Le compilateur est libre d'évaluer le côté gauche ou droit en premier et donc si les incréments ont pris effet au moment où le côté droit est évalué dépendra du compilateur (et en effet le compilateur pourrait faire une chose une fois et l'autre le suivant)

Les incréments ne sont garantis qu'à sequence point. La soustraction n'est pas un point de séquence.

EDIT: Bah, a écrit cette réponse lorsque la question a été marquée C/C++. Sequence points don't apply to Java. J'ai laissé la réponse dans d'autres cas trouvent utile lors de l'examen C/C++ expressions

+0

Il n'est pas indéfini "S'il sort 0 ou -1 pour le premier println et 0 ou 1 pour le second". C'est un comportement indéfini. Ce qui signifie qu'il pourrait imprimer 0, -1, 42, un certain nombre plus grand que INT_MAX, ou même faire exploser votre ordinateur. –

+0

True. En pratique, ce sera l'une des options que j'ai énoncées. Mais vous avez raison, vous ne pouvez pas compter sur ce –

2

Parce que c++ - c devient (c - c-incremented-by-one), qui est -1 et ++c - c devient (c-incremented-by-one - c-incremented-by-one) qui est 0.

0

Parce que l'incrément est effectué avant la opération dans un cas, alors que l'incrément est effectué après l'opération dans l'autre cas.

int c = 10; 
System.out.println(c); // output 10 
System.out.println(c++); // outputs 10 
System.out.println(c); // output 11 
System.out.println(++c); // output 12 
System.out.println(c); // output 12 
0

C'est la différence entre l'incrément de suffixe et de suffixe.

Voici un beau texte sur ce point:

http://www.java-samples.com/showtutorial.php?tutorialid=249

« Tant l'opérateur d'incrémentation (++) et l'opérateur de décrémentation (-) sont disponibles en deux variétés:. Préfixe et postfix La variété préfixe est écrit avant le nom de la variable (++ myAge), la variété postfix est écrite après (myAge ++)

Dans une déclaration simple, peu importe ce que vous utilisez, mais dans une instruction complexe, lorsque vous incrémentez (ou en décrémentant) une variable, puis en assignant le résultat à une autre variable, cela importe beaucoup. évalué avant l'affectation, le postfix est évalué après. La sémantique du préfixe est la suivante: incrémentez la valeur puis récupérez-la. La sémantique de postfix est différente: récupère la valeur puis incrémente l'original.

Cela peut être déroutant au premier abord, mais si x est un entier dont la valeur est comprise entre 5 et vous écrivez

int a = ++ x; vous avez dit au compilateur d'incrémenter x (en le faisant 6) puis d'extraire cette valeur et de l'assigner à un. Ainsi, un est maintenant 6 et x est maintenant 6.

Si, après avoir fait cela, vous écrivez

int b = x ++; vous avez maintenant demandé au compilateur d'aller chercher la valeur dans x (6) et de l'assigner à b, puis de revenir en arrière et d'incrémenter x. Ainsi, b est maintenant 6, mais x est maintenant 7. Listing ci-dessous montre l'utilisation et les implications des deux types. »

0

J'ai utilisé ce code C++

La raison est simple. L'opérateur ++ fait une copie de la var, augmentez la valeur puis renvoyez le val copié En supposant que les opérateurs sont évalués de gauche à droite, il passera 10-10 (alors inc C) donc il est toujours 0. Cependant, dans la plupart des cas, selon l'ordre est un comportement indéfini certains compilateurs comme gcc signale un avertissement (exemple http://codepad.org/UPBqO38B)

int main() 
{ 
int c=10; 
printf("%d", c-c++); 
}