2010-07-12 19 views
1

Je repassais le C++ FAQ Lite en ligne. Je regardais inline à nouveau puisque je ne l'ai pas trouvé une utilisation pour eux et je voulais savoir comment l'arrêté de la dépendance circulaire comme montré dans this réponse. J'ai d'abord essayé de faire, "Pourquoi les inlines sont meilleurs que les définitions." exemple avec le code suivant:Définir ne pas évaluer POD?

#define unsafe(i) \ 
    ((i) >= 0 ? (i) : -(i)) 

inline 
int safe(int i) 
{ 
    return i >= 0 ? i : -(i); 
} 

int f(); 

int main(void) 
{ 
    int x(5); 
    int ans; 

    ans = unsafe(x++); 
    cout << ans << endl; 
    ans = unsafe(++x); 
    cout << ans << endl; 

    ans = safe(x++); 
    cout << ans << endl; 
    ans = safe(++x); 
    cout << ans << endl; 

    std::cin.get(); 
    return 0; 
} 

EDIT:

Grand. J'ai eu la faute de frappe. Pas que je suis amer que je ne trouve pas de telles erreurs ou quoi que ce soit.

La sortie est maintenant 6, 9, 9, 11.

Cependant, même avec une pré-incrémentation, la première valeur ne devrait-elle pas donner 7?

Si la macro est appelée deux fois, puis ne pas se présenter comme suit:

dangereux (x) // pré-incrémentation ne modifie pas la valeur lorsqu'elle est appelée. Non sécurisé (++ x) // pour toutes fins utiles, l'incrémentation se produit avant le deuxième appel, donc le ++ x. C'est pour le premier ans = unsafe(x++) s'il est appelé deux fois.

Au moment où nous atteignons le deuxième ans = unsafe(++x), ne devrait pas avoir été incrémenté deux fois? Une fois par le double appel et une fois lorsque le premier double appel a été terminé?

+1

Je ne sais pas si c'est une faute de frappe ici, ou dans votre code actuel, mais la macro devrait être '((i)> = 0? (I): - (i))'. ('?' au lieu de '=') –

+0

Oui, oui c'est le cas. C'est tout à fait l'erreur stupide. – IAE

Répondre

3

Au lieu de:

#define unsafe(i) \ 
    ((i) >= 0 = (i) : -(i)) 

Je pense que vous voulez:

#define unsafe(i) \ 
    ((i) >= 0 ? (i) : -(i)) 

En réponse à votre édition:

Après le premier appel à unsafe(x++), x est 7, même si la ans est 6. C'est parce que vous avez la déclaration:

ans = ((x++) >= 0 ? (x++) : -(x++)) 

ans est affecté au milieu x++après la gauche la plus x++ est évaluée. Par conséquent, ans == 6 mais x == 7. La différence avec unsafe(++x) est que ans est affecté à ++x, ce qui signifie le résultat est ans == x == 9.

+0

Pour une raison quelconque, j'ai dû regarder cela pendant 30 secondes jusqu'à ce que je remarque la différence. Je te maudis, ternaire '?:' Opérateur! –

+0

même, mais qui le rend d'autant plus rageant quand vous remarquez que vous venez de votre exposé faute de frappe sur le SO: P question Mise à jour! – IAE