Je ne comprends pas pourquoi le code suivant imprime 2 au lieu de 1 ... 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. P> p>
6 Réponses :
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 à update strong>: l'expansion manuelle: p> se développe à: P > 2 code> (voir l'expansion dans la mise à jour). Afin d'obtenir un résultat souhaitable entourez la macro avec des parenthèses.
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>
(ABS (-2) -3) code> se développera à p>
((-2) < 0) ? -(-2) : (-2) - 3 = 2
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 code> ..
Vous avez oublié la parenthèse externe, essayez ceci:
#define ABS(x) (((x) < 0) ? -(x) : (x))
Cela produira effectivement 1, mais la question est la suivante: pourquoi? hehe
#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.
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.
dans http://coliru.stacked-crooked.com/a/59700F453A1DCAF9 avec la compile option -e
Le préprocesseur GCC a résolu ce problème: p> à ceci: p> vérifier votre auto p> p>
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.
Développons cette macro à la main: Nous avons maintenant un problème: binaire car nous avons déjà établi que p> évalue à est évaluée et, devine quoi? Il évalue Ce que vous devez faire est de changer votre macro comme suit: p> alors tout se développe Comme p> cette fois, p> évalue à Le reste doit être clair d'ici. p> Vous devez toujours em> envelopper des corps macro-macro dans une paire extérieure de parenthèses pour cette raison. P > p> - code> a une priorité supérieure à celle
?: code> , donc ce qui précède est analysé em> comme: p>
(- 2) <0 code> est vrai, nous évaluons
- (- 2) code>. Alors: p>
2 code>, donc L'expression p>
2 code>. P>
-1 code>. P>
Je l'écris à tort ... c'est de retour