2010-08-10 9 views
3

Bien que je ne l'aurais pas écrit moi-même, quel est le résultat attendu de l'instruction suivante où A (garanti à zéro entier ou positif) est supérieur à 1?C: Quelle sera la déclaration 'return A || 1 'retour quand A> 1?

return A || 1;

Dans de nombreuses langues, je pense A à retourner, à moins que la valeur de A est égal à zéro, auquel cas 1 serait.

Je n'ai pas mon livre C à portée de main, mais je constate qu'en réalité, la valeur 1 semble toujours être retournée. Est-ce un résultat de l'optimisation du compilateur ou étant donné l'ambiguïté potentielle de l'expression, est-ce que la valeur de retour est non-déterministe?

+2

Ne renvoie-t-il pas "YES", qui est ensuite converti en 1 si vous essayez de l'obtenir comme int? Je n'ai aucune idée de l'objectif C, je devine juste ici. (Un rapide google m'a dit que OUI est 'Vrai' de l'Objectif C.) – Stephen

+1

Pas tout à fait ... 'YES' dans Objective-C est juste une macro donnant' 1'. Donc, il retourne juste '1'. Aucune conversion en 'bool' (ou' BOOL' ou '_Bool' ou autre) n'est impliquée. – Yuji

+0

Peut-être que vous pensiez à 'return A? A: 1; ' –

Répondre

18

La norme dit

L'opérateur || doit céder 1 si l'une de ses opérandes comparer l'inégalité à 0; sinon, il donne 0. Le résultat a le type int.

Voir la section 6.5.14 du standard.

+0

Parfait, merci Yuji – Roger

+1

@Roger: Notez que si vous voulez l'effet alternatif que vous avez décrit, vous pouvez obtenir cela avec 'return A? A: 1; ' – caf

3

Le résultat attendu est OUI (ou vrai)

|| opérateur retourne la valeur true si au moins l'un de ses opérandes est vrai (2ème opérande dans votre code est évidemment vrai)

+0

Doh! Bien sûr. Je pense que toute la pluie a transformé mon cerveau en bouillie cet après-midi. J'essayais de l'expliquer à quelqu'un d'autre après avoir corrigé le bogue et j'étais trop accroché à la valeur des chiffres. – Roger

+0

La réponse n'a rien à voir avec des #defines de 'true' ou' YES' mais seulement avec le résultat de l'expression qui est de type int. Dans ce cas toujours 1. –

2

Ceci est droit C (pas d'objectif-C impliqué). Il retournera toujours 1.

0

En C, le résultat de ||, && ou ! est toujours 0 ou 1, jamais une autre valeur non nulle, quelles que soient les valeurs des opérandes. Cela signifie que votre A || 1 cédera toujours 1.

0

avec des langages C toute valeur différente de zéro est vraie (représentée par 1). Et si votre A est nul, il vérifiera les autres comparaisons s'il s'agit d'une comparaison OU

Il suffira de dire, dans votre exemple, quelle que soit la valeur de A, retournera toujours 1 même si vous utilisez || 2. avec 2 étant non nul, lorsqu'il est effectué avec l'opérateur logique OU, retournera toujours vrai (représenté par 1)

0

Je crois que le compilateur optimisera et même n'examinera pas la valeur de A. Quelqu'un peut-il confirmer? J'avais l'impression qu'avec A & 0, A || 1 et A || 0 (= A & & 1), le compilateur gagne du temps en reconnaissant que l'expression peut être simplifiée à 0, 1 ou A respectivement .

Questions connexes