44 votes

Pourquoi voudriez-vous utiliser l'opérateur ternaire sans attribuer une valeur pour le "vrai" condition (x = x ?: 1)

Dans l'Android open-source qemu code que j'ai couru à travers cette ligne de code:

machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */

Est-ce juste une manière confuse de dire:

if (machine->max_cpus) {
   ; //do nothing
} else {
 machine->max_cpus = 1;
}

Si oui, ne serait-il pas plus clair que:

if (machine->max_cpus == 0) machine->max_cpus = 1;

Fait intéressant, cette compile et fonctionne très bien avec gcc, mais ne compile pas sur http://www.comeaucomputing.com/tryitout/ .

54voto

Uri Points 50687

C'est autorisé dans GNU, comme un obscur extension de C

5.7 Conditions avec Omis Opérandes

Le milieu opérande dans une conditionnelle l'expression peut être omis. Ensuite, si le le premier opérande est différente de zéro, sa valeur est la valeur du conditionnel de l'expression.

Par conséquent, l'expression

 x ? : y

a la valeur de x si c'est différent de zéro; sinon, la valeur de y.

Cet exemple est parfaitement équivalent pour

 x ? x : y

Dans ce cas simple, la capacité de omettre le milieu opérande n'est pas particulièrement utile. Quand il devient utile est le premier opérande n', ou peut (si c'est une macro argument), contenir un effet secondaire. Puis en répétant l'opérande dans le milieu serait effectuer le côté effet deux fois. En omettant le milieu opérande utilise le la valeur déjà calculée sans le effets indésirables de la re-calculer.

Comme vous pouvez probablement le deviner, en évitant ce qui est recommandé pour des raisons de lisibilité et des raisons de portabilité. Je suis honnêtement surpris de voir une telle grammaire-incompatible extension à C.

11voto

Michael Mrozek Points 44120

C'est un GCC extension qui signifie "si la condition est vraie, l'utiliser, sinon utiliser cette autre valeur", de sorte

machine->max_cpus = machine->max_cpus ?: 1;

est une abréviation pour

machine->max_cpus = machine->max_cpus ? machine->max_cpus : 1;

même si le conditionnel a des effets secondaires, il ne sera exécuté une fois

7voto

Larry Engholm Points 322

À l'aide de gcc -pédant drapeau, il ne dit

foo.c:5: avertissement: ISO C interdit en omettant le moyen terme d'une ?: expression

4voto

John Marshall Points 3853

C'est un GCC extension, et il devient plus intéressant et utile lorsque l'état a des effets secondaires.

Dans ce cas, oui, je serais d'accord c'est obscur, plus qu'autre chose.

1voto

Larry Engholm Points 322

Le K&R de la BNF montre une expression est nécessaire entre les "?" et ":". Je ne pense pas que gcc devrait être de la compilation que, sans un diagnostic.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X