6
votes

Macro produisant un mauvais numéro

Je ne comprends pas pourquoi le code suivant imprime 2 au lieu de 1 ... xxx

Cette question était sur notre examen et j'ai répondu que la sortie est 1 mais après avoir compilé, je reçois 2 ... Quelqu'un voudrait-il expliquer quelle est l'expression réellement ... merci d'avance.


1 commentaires

Je l'écris à tort ... c'est de retour


6 Réponses :


2
votes

Il y a un problème avec des parenthèses. Si vous développez la macro, vous obtiendrez des opérations ternaires imbriquées complexes, qui évaluent à 2 code> (voir l'expansion dans la mise à jour). Afin d'obtenir un résultat souhaitable entourez la macro avec des parenthèses.

update strong>: l'expansion manuelle: p> xxx pré>

se développe à: P > xxx pré>

ABS (-3) code> est entouré par des parenthèses partout, il est donc évalué en toute sécurité à 3 code>, donc pas besoin de développer ce. Donc nous finissons par: p> xxx pré>

(ABS (-2) -3) code> se développera à p>

((-2) < 0) ? -(-2) : (-2) - 3 = 2


4 commentaires

Mais notre question nous a posée pour la sortie. Comment dois-je calculer la sortie?


Ensuite, je suppose que nous devrions l'étendre .. Attendez une mise à jour.


Merci mec ... laissez-moi essayer de le comprendre. Je ne peux même pas croire que c'est apparu dans notre examen!


Êtes-vous sûr que cela n'a pas été parenthléisé à l'examen? Je crois que la réponse souhaitable, il y avait 1 ..



3
votes

Vous avez oublié la parenthèse externe, essayez ceci:

#define ABS(x) (((x) < 0) ? -(x) : (x))


1 commentaires

Cela produira effectivement 1, mais la question est la suivante: pourquoi? hehe



1
votes
#include <stdio.h>
#define ABS(x) ((x) < 0) ? -(x) : (x))
int main()
{
    printf( "%d", ABS( ABS(-2) - ABS(-3) ) );
    return 0;
}
You forgot the closing right parenthesis ) in your #define.Also, return needs to be lowercaseI put spaces, so you can see the grouping more clearly.

2 commentaires

Il ne manque pas d'une parenthèse


Il n'y a pas de parenthèse manquante. Vous avez cassé le code. Cela ne compile plus.



1
votes

dans http://coliru.stacked-crooked.com/a/59700F453A1DCAF9 avec la compile option -e

Le préprocesseur GCC a résolu ce problème: xxx

à ceci: xxx

vérifier votre auto


0 commentaires

1
votes

Vous avez besoin d'une parenthèse autour de l'expression que ABS code> définit. Au lieu de

( (((-2) < 0) ? -(-2) : (-2)) - ( (((-3) < 0) ...
  ^ ------ one term ------- ^ There is no running in to the next term.


0 commentaires

1
votes

Développons cette macro à la main: xxx

Nous avons maintenant un problème: binaire - a une priorité supérieure à celle ?: , donc ce qui précède est analysé comme: xxx

car (- 2) <0 est vrai, nous évaluons - (- 2) . Alors: xxx

nous avons déjà établi que xxx

évalue à 2 , donc L'expression xxx

est évaluée et, devine quoi? Il évalue 2 .

Ce que vous devez faire est de changer votre macro comme suit: xxx

alors tout se développe Comme xxx

cette fois, xxx

évalue à -1 .

Le reste doit être clair d'ici.

Vous devez toujours envelopper des corps macro-macro dans une paire extérieure de parenthèses pour cette raison.


0 commentaires