Ist diese ternäre Bedingung?: Korrekte (objektive) C-Syntax?
Lesezeit: 2 Minuten
Ich hätte nicht gedacht, dass dies möglich ist, aber anscheinend ist es in Objective C erlaubt:
int a = b ?: c;
Sie sehen also, was sie hier tun, sie lassen den zweiten Teil des ternären Ausdrucks weg, sodass b als zweiter Teil verwendet wird, wenn b nicht Null ist.
Es ist schlau, aber soweit ich weiß, ist dies gegen K & R C und wahrscheinlich ANSI C.
Wenn nicht, habe ich jahrelang einen furchtbar cleveren Syntaxtrick verpasst … leider!
Update: Es ist gcc.
Welcher Compiler? GCC hat dies als Erweiterung, wenn auch eine veraltete.
– Kerrek SB
6. Januar 2012 um 15:57 Uhr
Korrekter Begriff ist bedingt. Ternär bedeutet nur, dass es sich um einen Operator handelt, der 3 Argumente akzeptiert.
Eine GNU-Erweiterung zu C erlaubt es, den zweiten Operanden wegzulassen und den ersten Operanden implizit auch als zweiten zu verwenden:
a = x ? : y;
Der Ausdruck ist äquivalent zu
a = x ? x : y;
mit der Ausnahme, dass x ein Ausdruck nur einmal ausgewertet wird. Der Unterschied ist signifikant, wenn die Auswertung des Ausdrucks Nebenwirkungen hat.
Stefan Fischer
Dieses Verhalten ist für beide definiert gcc und clang. Wenn Sie macOS- oder iOS-Code erstellen, gibt es keinen Grund nicht um es zu benutzen.
Ich würde es jedoch nicht in portablem Code verwenden, ohne es sorgfältig zu prüfen.
$ cat > foo.c
#include <stdio.h>
int main(int argc, char **argv)
{
int b = 2;
int c = 4;
int a = b ?: c;
printf("a: %d\n", a);
return 0;
}
$ gcc -pedantic -Wall foo.c
foo.c: In function ‘main’:
foo.c:7: warning: ISO C forbids omitting the middle term of a ?: expression
Also nein, es ist nicht erlaubt. Was gcc in diesem Fall ausgibt, tut dies:
$ ./a.out
a: 2
Das undefinierte Verhalten tut also das, was Sie in Ihrer Frage sagen, obwohl Sie sich nicht darauf verlassen möchten.
Ich mag Ihre Verwendung des Wortes “undefiniert” hier nicht. Es wäre besser, es nicht standardmäßig zu nennen; das Verhalten IST für GCC definiert, nur nicht für ISO C. Das macht es für andere Compiler undefiniert und nicht portierbar, aber es ist immer noch für GCC definiert.
– Steven Fischer
18. Januar 2012 um 22:22 Uhr
@steven Da die Frage war, ob es sich um die richtige C-Syntax handelt, ist die Tatsache, dass es sich um ein undefiniertes Verhalten in C handelt, die richtige Antwort, unabhängig davon, was Ihr Compiler tut.
– Benutzer23743
19. Januar 2012 um 10:47 Uhr
sidyll
Das ist ein GNU-C-Erweiterung. Überprüfen Sie Ihre Compiler-Einstellungen (suchen Sie nach C-Variante). Ich bin mir nicht sicher, ob es Teil von Clang ist, die einzigen Informationen, die ich bekommen konnte, sind drin diese Seite:
Einführung
Dieses Dokument beschreibt die von Clang bereitgestellten Spracherweiterungen. Zusätzlich zu den hier aufgeführten Spracherweiterungen zielt Clang darauf ab, eine breite Palette von GCC-Erweiterungen zu unterstützen. Weitere Informationen zu diesen Erweiterungen finden Sie im GCC-Handbuch.
14037200cookie-checkIst diese ternäre Bedingung?: Korrekte (objektive) C-Syntax?yes
Welcher Compiler? GCC hat dies als Erweiterung, wenn auch eine veraltete.
– Kerrek SB
6. Januar 2012 um 15:57 Uhr
Korrekter Begriff ist bedingt. Ternär bedeutet nur, dass es sich um einen Operator handelt, der 3 Argumente akzeptiert.
– Kneipe
6. Januar 2012 um 16:05 Uhr