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.

    – Kneipe

    6. Januar 2012 um 16:05 Uhr

Benutzeravatar von Joachim Isaksson
Joachim Isakson

Aus http://en.wikipedia.org/wiki/%3F%3A

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.

Benutzeravatar von Steven Fisher
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

Benutzeravatar von sidyll
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.

1403720cookie-checkIst diese ternäre Bedingung?: Korrekte (objektive) C-Syntax?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy