Il s'agit d'un programme de routine C normal que j'ai découvert dans une banque de questions. Il est indiqué ci-dessous:
#define CUBE(p) p*p*p main() { int k; k = 27 / CUBE(3); printf("%d", k); }
13 Réponses :
Le préprocesseur se substitue simplement avec p> afin de vous retrouver avec: p> Qui, évalué de gauche à droite avec la priorité de l'opérateur, est en fait 81. P> Si vous ajoutez des parenthéses autour de la macro, vous devez trouver les résultats sont corrects: P> < Pré> xxx pré> Il serait encore préférable d'entourer chaque instance de Qui vous permettra de passer des expressions à la macro correctement (par exemple, p code> avec des parenthéses aussi, comme dans: p>
1 + 2 code>). P> p>
Ou, meilleur, #define cube (p) (p) * (p) * (p)) code>
Je le ferais effectivement: #define cube (p) (p) * (p) * (p) * (p)) mais même c'est mauvais, si p est un appel de fonction. Cela peut être appelé par inadvertance 3 fois.
wow ... c'est juste le jeu de la précédente de l'opérateur.Merci James et Alok.
C'est pourquoi la Convention est d'utiliser des majuscules pour les macros - afin que vous réalisiez qu'ils peuvent évaluer leurs arguments plus d'une fois.
k= 27/3*3*3 =(((27/3)*3)*3) (The precedence of `*` and `/` are same but the associativity is from left to right) =((9*3)*3) =81
Les préprocesseurs doivent être parenthèses correctement. Remplacez-le par
#define CUBE(p) ((p)*(p)*(p))
Et méfiez-vous, même ceci est cassé pour Cube (++ I) ou Cube (F (x))
Votre macro n'est pas protégée. Essayez la macro actuelle a été étendue à p> qui est ((27/3) * 3) * 3 p> p>
#define CUBE(p) ((p)*(p)*(p))
Lorsque vous faites des macros, vous devez faire attention à la façon dont vous placez des parenthèses. Dans ce cas, vous n'en avez pas, l'expression devient donc 27/3 * 3 * 3, qui par la présence des règles de / et * devient (27/3) * 3 * 3. P>
C macros de la substitution textuelle (c'est-à-dire que c'est équivalent à la copie et au code de collage). Donc, votre code va de: à p> division et multiplication ont la même précision et avoir une associativité à droite à droite, donc Ceci est analysé comme suit: p> 9 * 3 * 3 = 81. p> C'est pourquoi les macros C devraient toujours être définis avec une utilisation libérale de Parenthèses: p> Pour plus d'informations, reportez-vous à la section http://c-faq.com/cpp/safemacros.html à partir de la FAQ comp.lang.c. p> p>
Étant donné que les macros sont une substitution textuelle qui fonctionne à: puisque la multiplication et la division se produisent de gauche à droite, cela fonctionne à: p> Donc, vous voulez modifier cela de deux manières: p> Les parenthèses extérieures font que les multiplications soient effectuées avant toute autre opération. P> < p> Les parenthèses autour des PP sont pour le cas où vous faites: p> sans ces parenthèses intérieures, la priorité de l'opérateur vous trébuchera. P> P> P> P >
27/3 * 3 * 3 = 9 * 3 * 3 = 81? P>
Les deux / et * les opérateurs ont la même précalence. Pour exécuter 3 * 3 * 3 d'abord, vous devriez les enfermer entre parenthèses.
#include <stdio.h> #define CUBE(p) p*p*p int main () { int k; k=27/(CUBE(3)); printf("%d",k); return 0; }
à cause de la précédente opérateur Vous pouvez utiliser à la place: p> 27/3 * 3 * 3 = 81 code> strong>
inline int cube(int p) { return p*p*p; }
C'est la manière dont l'associativité et la priorité des opérateurs sont mises en œuvre. Quand l'expression est élargie, il devient 27/3 * 3 * 3 et non 27 / (3 * 3 * 3) strong> Maintenant, la division et la multiplication ont la même précalence en C mais l'associativité est laissée à droite pour les deux. Donc, il peut être montré comme suit: (27/3) * 3 * 3 qui à son tour est égal à (9 * 3) * 3 = 81 De plus, si vous vous souvenez de l'ancienne règle arithmétique de Bodmas (SUPPLICATION DE SUPPORT DE DIVISION DE DIVISION) STROND>, c'est l'ordre de la priorité, nous faisons ensuite la division d'abord, puis la multiplication. Encore une fois, nous obtenons une réponse comme 81 pour 27/3 * 3 * 3. P>
HI réponse pour cela est: 81 Explication: À l'étape k = 27 / cube (3) Cube (3) est remplacé par 3 * 3 * 3 par préprocesseur.Then ci-dessus déclaration devient as k = 27/3 * 3 * 3 Dans cette expression 27/3 est évaluée par C compilateur C (précédence de l'opérateur) Le résultat est (27/3): 9 La déclaration K = 27/3 * 3 * 3 devient comme k = 9 * 3 * 3; Le résultat de la déclaration ci-dessus est de 81: p>
Il suffit de remplacer
cube (3) code> dans votre
k = ... code> ligne par
3 * 3 * 3 code> et voyez ce que vous obtenez votre expression .
Quelle langue est-ce que «des doutes» semble être un synonyme de "problème" ou "question"?
@ETher: comme un Indien, je peux définitivement dire que c'est nous. J'ai appris le difficile chemin moi-même! Une fois que mon professeur m'a dit: "Avez-vous un doute sur la question, ou une question sur la question?" J'espère que vous ne doutez pas de moi quand je dis ça. :-)
Lorsque vous travaillez avec un problème de préprocesseur, comme celui-ci, utilisez la sortie de préprocesseur pour voir où se trouve le problème (GCC -E File.c)
C'est pourquoi il est recommandé d'utiliser des fonctions au lieu de macros. Sur la plupart des compilateurs modernes, la vitesse est la même.