Forum: Compiler & IDEs Fragezeichen in C-Code - was ist das?


von roehrevorheizer (Gast)


Lesenswert?

Hallo ,


ich bin beim Experimentieren mit Code für GLCDs auf solche Passagen 
gestoßen und wundere mich über das Fragezeichen:


http://members.chello.at/~easyfilter/bresenham.html

 xx += sx; xx *= sx = x0 < x2 ? 1 : -1;          /* x step direction */
      yy += sy; yy *= sy = y0 < y2 ? 1 : -1;          /* y step 
direction */


Was für eine Konstruktion ist das da mit dem Fragezeichen und dem 
Doppelpunkt?
Wo könnte man darüber etwas nachlesen?


Wäre für Tipps dankbar.


mit freundlichem Gruß

von Mike (Gast)


Lesenswert?


von roehrevorheizer (Gast)


Lesenswert?


von roehrevorheizer (Gast)


Lesenswert?

am wichtigsten ist dies hier:

Unless you are writing time critical code (and lets face it, thats 
unlikely) the more efficent code is not much of a reason to use this 
construct. I feel that it has its uses, but should not be lost into some 
complex statement, but, since when did C programmers worry if anyone 
else could read their code ;-)

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Wobei ich in dem Code die 'conditional expression' wesentlich weniger 
schlimm finde (eigentlich gar nicht) als das hier:
1
xx *= sx = x0 < x2 ? 1 : -1;

Zuweisungen als Operanden mag ich gar nicht :-)

von Peter S. (psavr)


Lesenswert?

1
xx += sx; xx *= sx = x0 < x2 ? 1 : -1;

oder besser...
1
xx += sx;
2
if (x0 < x2)
3
{
4
  sx  = 1;
5
}
6
else
7
{
8
  sx  = -1;
9
}
10
xx *= sx;

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

roehrevorheizer schrieb:
> am wichtigsten ist dies hier:
> Unless you are writing time critical code

Der Teil ist allerdings mit aktuellen Compilern Unsinn. Der 
Fragezeichenoperator führt zu keinem schnelleren Code, als eine 
if/else-Konstruktion.

Oliver

von Markus F. (mfro)


Lesenswert?

Das mit dem ternary operator ist m.E. nicht schwieriger zu lesen als ein 
if-Konstrukt. Ist halt so wie mit vielen Dingen: "was der Bauer nicht 
kennt, das frißt er nicht".

Es gibt eine Sache, die der ternary operator besser/mehr kann als 
if/else:
1
const int m = (a > b) ? a : b;

Das geht mit if/else so nicht.

von Dussel (Gast)


Lesenswert?

Markus F. schrieb:
> Das mit dem ternary operator ist m.E. nicht schwieriger zu lesen als ein
> if-Konstrukt. Ist halt so wie mit vielen Dingen: "was der Bauer nicht
> kennt, das frißt er nicht".
Genau das. In vielen Fällen ist es deutlich einfacher zu lesen. Vor 
Allem, wenn auch noch sinnvoll kommentiert ist.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Wieder mal mein Lieblingsbeispiel :-)
1
led_out(1 << (ledCnt = ++ledCnt<8 ? ledCnt : 0));

Normalerweise benutze ich diesen Operator aber nur für true/false.

: Bearbeitet durch User
von Dussel (Gast)


Lesenswert?

Random ... schrieb:
> Wieder mal mein Lieblingsbeispiel :-)
>
1
led_out(1 << (ledCnt = ++ledCnt<8 ? ledCnt : 0));
>
> Normalerweise benutze ich diesen Operator aber nur für true/false.
Kurz, übersichtlich und für einen erfahrenen C- oder Java-Programmierer 
problemlos zu lesen. So sollte man Operatoren meiner Meinung nach 
nutzen.

von Peter D. (peda)


Lesenswert?

Oliver S. schrieb:
> Der Teil ist allerdings mit aktuellen Compilern Unsinn. Der
> Fragezeichenoperator führt zu keinem schnelleren Code, als eine
> if/else-Konstruktion.

Es gibt keinen Deckel, der auf alle Töpfe paßt.
Manchmal ist ?: schneller und manchmal if/else.

von Oliver S. (oliverso)


Lesenswert?

Peter Dannegger schrieb:
> Manchmal ist ?: schneller und manchmal if/else.

Na ja, jeder einigermaßen anständige Compiler sollte für beide Varianten 
gleich schnellen Code erzeugen. Semnatisch ist das schließlich absolut 
identisch.

Oliver

von Peter II (Gast)


Lesenswert?

Oliver S. schrieb:
> Na ja, jeder einigermaßen anständige Compiler sollte für beide Varianten
> gleich schnellen Code erzeugen. Semnatisch ist das schließlich absolut
> identisch.

ja nach Anwendung aber nicht.
1
if ( a<b ) 
2
  foo( a )
3
else 
4
  foo( b );

vs
1
foo( a<b ? a : b )


hier könnte ich mir durchaus vorstellen das nicht der gleiche asm code 
generiert wird.

von Oliver S. (oliverso)


Lesenswert?

Peter II schrieb:
> hier könnte ich mir durchaus vorstellen

Kannst du.

Peter II schrieb:
> das nicht der gleiche asm code
> generiert wird.

Warum? Wenn du es genau wissen willst, prüf es doch einfach nach, mit 
eingeschalteter Optimierung.

Oliver

von Peter II (Gast)


Lesenswert?

Oliver S. schrieb:
> Warum?

weil es 2 verschiedene dinge sind, beim IF sind 2 funktionsaufrufe beim 
? nur einer.

> Wenn du es genau wissen willst, prüf es doch einfach nach, mit
> eingeschalteter Optimierung.
dafür habe ich hier kein passendes System am laufen.

von plex (Gast)


Lesenswert?

Random ... schrieb:
> Wieder mal mein Lieblingsbeispiel :-)led_out(1 << (ledCnt = ++ledCnt<8 ?
> ledCnt : 0));
>
> Normalerweise benutze ich diesen Operator aber nur für true/false.
Das ist aber schon ein ziemliches Stückchen. Auch wenn ich nicht ganz 
unerfahren bin, bevorzuge ich den langen Weg. Die Kurzschreibweise muß 
ich ja schließlich auch im Kopf wieder "unfolden", um dahinter zu 
steigen. Da ist eine ordentliche lange Schreibweise sehr viel 
einleuchtender, insbesondere, wenn keine Kommentare im Quelltext 
vorhanden sind. Hatte das schon und das macht keinen Spaß, wenn der 
Urheber von kryptischem Code der Meinung ist, daß alles sich nach ihm zu 
richten hat und "the code is the comment" oberste Prämisse ist. Das kann 
sich im Projekt sehr verzögernd auswirken.
Mir kann auch keiner erzählen, daß er nach einem halben Jahr noch gena 
weiß, was er an so einer üblen Stelle bewirken wollte, ohne mehrfach 
über den Code zu gehen. Deshalb: Der lange Weg ist der bessere.

Peter II schrieb:
> weil es 2 verschiedene dinge sind, beim IF sind 2 funktionsaufrufe beim
> ? nur einer.
Das ist doch Quark. Der ASM macht einen Branch oder so je nach Prozessor 
draus. Denkst du nicht, daß der Compiler beide Varianten in dieselbe 
Form überführt, bevor er es übersetzt? Beides hat dieselbe Wirkung. Du 
machst dir damit um den Preis der "Coolness" nur selber das Leben 
schwer.

von Peter II (Gast)


Lesenswert?

plex schrieb:
> Das ist doch Quark. Der ASM macht einen Branch oder so je nach Prozessor
> draus.

nein macht er nicht.

Version mit IF
1
        call    rand
2
        movl    $20, %edi
3
        movl    %eax, %ebx
4
        xorl    %eax, %eax
5
        call    rand
6
        cmpl    %eax, %ebx
7
        jl      .L8
8
        movl    %eax, %edi
9
        call    foo
10
        popq    %rbx
11
        .cfi_remember_state
12
        .cfi_def_cfa_offset 8
13
        .p2align 4,,3
14
        ret
15
.L8:
16
        .cfi_restore_state
17
        movl    %ebx, %edi
18
        call    foo
19
        popq    %rbx
20
        .cfi_def_cfa_offset 8
21
        .p2align 4,,5
22
        ret
23
        .cfi_endproc

Version mit ?
1
        call    rand
2
        movl    $20, %edi
3
        movl    %eax, %ebx
4
        xorl    %eax, %eax
5
        call    rand
6
        cmpl    %ebx, %eax
7
        cmovle  %eax, %ebx
8
        movl    %ebx, %edi
9
        call    foo
10
        popq    %rbx
11
        .cfi_def_cfa_offset 8
12
        ret

1
#include <stdio.h>
2
3
void __attribute__ ((noinline))  foo( int x )
4
{
5
   printf("x = %d\n");
6
}
7
8
int main()
9
{
10
  int a = rand(10);
11
  int b = rand(20);
12
/*
13
  if ( a<b )
14
     foo( a );
15
  else
16
     foo( b );
17
*/
18
  foo( a < b ? a : b );
19
}
gcc test.c -S -O2

von SF (Gast)


Lesenswert?

Wenn du aber denselben Test mit -Os machst
1
avr-gcc test.c -S -Os

so kommt beim Winavr2010 beides mal derselbe Assembler Code raus:
1
foo:
2
/* prologue: function */
3
/* frame size = 0 */
4
  rcall .
5
  ldi r24,lo8(.LC0)
6
  ldi r25,hi8(.LC0)
7
  in r30,__SP_L__
8
  in r31,__SP_H__
9
  std Z+2,r25
10
  std Z+1,r24
11
  rcall printf
12
  pop __tmp_reg__
13
  pop __tmp_reg__
14
/* epilogue start */
15
  ret
16
  .size  foo, .-foo
17
.global  main
18
  .type  main, @function
19
main:
20
  push r28
21
  push r29
22
/* prologue: function */
23
/* frame size = 0 */
24
  ldi r24,lo8(10)
25
  ldi r25,hi8(10)
26
  rcall rand
27
  mov r28,r24
28
  mov r29,r25
29
  ldi r24,lo8(20)
30
  ldi r25,hi8(20)
31
  rcall rand
32
  cp r28,r24
33
  cpc r29,r25
34
  brge .L4
35
  mov r24,r28
36
  mov r25,r29
37
.L4:
38
  rcall foo
39
/* epilogue start */
40
  pop r29
41
  pop r28
42
  ret

D.H. mit den richtigen Optimierungseinstellungen verhält sich der 
Compiler, so wie erwartet.

von Peter D. (peda)


Lesenswert?

plex schrieb:
> Das ist doch Quark. Der ASM macht einen Branch oder so je nach Prozessor
> draus.

Nö, der Assemblercode kann manchmal gleich sein, ist es aber oft nicht.
Es gibt 2 Hauptunterschiede:
Der ? Operator ist ein Sequence point.
Der ? Operator hat einen Wert, if aber nicht.

von Peter II (Gast)


Lesenswert?

SF schrieb:
> D.H. mit den richtigen Optimierungseinstellungen verhält sich der
> Compiler, so wie erwartet.

was ist an -Os richtiger als -Os - wird sind bei GCC nicht beim µC. 
Außerdem ist es auch mit -Os auf einen PC nicht gleich. Und nicht so wie 
du erwartest.

von Torsten (Gast)


Lesenswert?

plex schrieb:

> Mir kann auch keiner erzählen, daß er nach einem halben Jahr noch gena
> weiß, was er an so einer üblen Stelle bewirken wollte, ohne mehrfach
> über den Code zu gehen. Deshalb: Der lange Weg ist der bessere.

der Code sollte so geschrieben werden, dass Kollegen ihn lesen können. 
Das bedeutet nicht, dass ihn jeder Berufsanfänger lesen können muss, der 
sich nicht die Mühe macht, eine Sprache vor der Verwendung zu lernen.

?: ist ein Operator, mit dem sich z.B: auch Konstanten initialisieren 
lassen:
1
const int f = a ? b : c;
das geht nicht:
1
const int f = b;
2
if (!a)
3
  f = c;

von Vlad T. (vlad_tepesch)


Lesenswert?

plex schrieb:
> Der ASM macht einen Branch oder so je nach Prozessor
> draus.

eventuell aber auch einen "conditional move", der exakt der Semantik von
1
int f = a ? b : c;
entspricht, auch wenn der Kompiler eventuell auch so clever ist, ein if 
else dahingehend zu überführen
1
int f;
2
if (a)
3
  f = b;
4
else
5
  f = c;

ich finde ersteres lesbarer

von plex (Gast)


Lesenswert?

Peter II schrieb:
> was ist an -Os richtiger als -Os - wird sind bei GCC nicht beim µC.
Du warst bei -O2 und das ist nun mal was anderes als -Os.
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

> Außerdem ist es auch mit -Os auf einen PC nicht gleich. Und nicht so wie
> du erwartest.
Und warum reitest du dann auf dem anders generierten ASM Code rum? Kann 
dir doch egal sein was beim PC-ASM rauskommt, wenn Codesize keine Rolle 
spielt und das Ergebnis stimmt.

von Peter II (Gast)


Lesenswert?

plex schrieb:
> Und warum reitest du dann auf dem anders generierten ASM Code rum? Kann
> dir doch egal sein was beim PC-ASM rauskommt, wenn Codesize keine Rolle
> spielt und das Ergebnis stimmt.

Ich wollte nur zeigen das mit am dem ? auch schnelleren code als mit if 
schreiben kann. Oben hat jemand behauptet  hat, in beiden Fälle kommt 
der gleiche code raus - das stimmt nicht.

es bezog sich alles auf

Peter II schrieb:
> weil es 2 verschiedene dinge sind, beim IF sind 2 funktionsaufrufe beim
> ? nur einer.
Das ist doch Quark. Der ASM macht einen Branch oder so je nach Prozessor
draus. Denkst du nicht, daß der Compiler beide Varianten in dieselbe
Form überführt, bevor er es übersetzt?

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Peter II schrieb:
> Das ist doch Quark. Der ASM macht einen Branch oder so je nach Prozessor
> draus. Denkst du nicht, daß der Compiler beide Varianten in dieselbe
> Form überführt, bevor er es übersetzt?

Wer lesen kann, ist strategisch im Vorteil:

Peter Dannegger schrieb:
> Der ? Operator ist ein Sequence point.
> Der ? Operator hat einen Wert, if aber nicht.

von Oliver S. (oliverso)


Lesenswert?

Peter Dannegger schrieb:
> Der ? Operator ist ein Sequence point.
Genauso wie die "Controlling Expression" im if-statement. Kein 
Unterschied.

> Der ? Operator hat einen Wert, if aber nicht.
Richtig. Genau deshalb gibt es den Operator. Drückt man das mit if/else 
aus, braucht es dafür eine lokale Variable. Da es in Assembler aber 
"einen Wert" nicht gibt, da muß alles irgendwo abgelegt werden, egal, ob 
"Wert" oder "Variable", gibt es deshalb alleine keinen Grund, 
unterschiedlichen Assemblercode zu erzeugen.

Oliver

von plex (Gast)


Lesenswert?

Torsten schrieb:
1
 const int f = a ? b : c;
> das geht nicht:
1
const int f = b;
2
if (!a)
3
   f = c;
Das stimmt aber so nicht ganz. Wenn du es richtig nach deiner 
"contition" ausformulieren würdest, kämest du auf:
1
const int f;
2
if (a)
3
  f = b;
4
else
5
  f = a;
So wäre das richtig verwendet und steht deinem Ausdruck in nichts nach. 
Ohne Voodoo und dazu noch übersichtlich.
Mit dem "!" (not) kann man gehörig auf die Nase fallen, wenn es sich 
nicht um true/false Werte handelt. Alles schon gesehen.

von avr (Gast)


Lesenswert?

plex schrieb:
> const int f;
> if (a)
>   f = b;
> else
>   f = a;
> So wäre das richtig verwendet und steht deinem Ausdruck in nichts nach.
> Ohne Voodoo und dazu noch übersichtlich.

Nicht wirklich. Eher redudanter Code und dazu deutlich länger.

> Mit dem "!" (not) kann man gehörig auf die Nase fallen, wenn es sich
> nicht um true/false Werte handelt. Alles schon gesehen.

Das wäre mir neu. Aber wer denkt true == 1, dem kann das schon 
passieren.

von Oliver S. (oliverso)


Lesenswert?

Torsten schrieb:
> das geht nicht

plex schrieb:
> const int f;
> if (a)
>   f = b;
> else
>   f = a;
> ... und steht deinem Ausdruck in nichts nach.

Stimmt. Geht genauso wenig.

Oliver

von plex (Gast)


Lesenswert?

Oliver S. schrieb:
> Stimmt. Geht genauso wenig.
Jup, da habe ich mich wohl zu schnell blenden lassen. Hast recht :-)

von plex (Gast)


Lesenswert?

avr schrieb:
> Nicht wirklich. Eher redudanter Code und dazu deutlich länger.
Führt aber zu weniger Verwirrung und schnellerer Erfassung der Aufgabe 
des Codes. Und jetzt komm hier nicht mit Redundanz und Sourcecodelänge 
in Zeiten von Terabyte Festplatten um die Ecke. Da kann man Kommentare 
auch gleich weglassen und sofort binär programmieren. Das ist nun gar 
kein Argument.

von Karl H. (kbuchegg)


Lesenswert?

plex schrieb:
> avr schrieb:
>> Nicht wirklich. Eher redudanter Code und dazu deutlich länger.
> Führt aber zu weniger Verwirrung und schnellerer Erfassung der Aufgabe
> des Codes.


1
  if( haveError )
2
    penColor = RED;
3
  else
4
    penColor = BLACK;
5
6
  if( isOutputPin )
7
    penStyle = NORMAL;
8
  else
9
    penStyle = ITALIC;
10
11
  if( isAboveMaximum )
12
    strcpy( fontName, "Times Roman" );
13
  else
14
    strcpy( fontName, "Arial" );
15
16
  drawText( pinName, penColor, penStyle, fontName );

versus
1
  drawText( pinName,
2
            haveError ? RED : BLACK,
3
            isOutputPin ? NORMAL : ITALIC,
4
            isAboveMaximum ? "Times Roman" : "Arial"
5
          );

die Variante ohne Hilfsvariablen mit ineinander geschaltelten if-else 
Konstrukten, die in 6 unterschiedlichen Aufrufen von DrawText münden, 
will ich mir erst gar nicht ausmalen.

Wie immer gilt: man kann jedes Sprachkonstrukt zum Vorteil des 
Programmierers ausnutzen. Man kann es aber auch übertreiben und dann 
dreht sich der Effekt ins Gegenteil um.

: Bearbeitet durch Moderator
von plex (Gast)


Lesenswert?

Karl Heinz schrieb:
> Wie immer gilt: man kann jedes Sprachkonstrukt zum Vorteil des
> Programmierers ausnutzen. Man kann es aber auch übertreiben und dann
> dreht sich der Effekt ins Gegenteil um.
Hier muß ich dir beipflichten. Eine Sache noch: Wie sieht es beim Debug 
aus? Meiner Erfahrung nach sind die Kurzkonstrukte da wirklich nicht 
hilfreich, weil einfach die Übersicht fehlt (und auch die 
Hilfsvariablen), wenn der Marker nur in derselben Zeile herumtanzt. Da 
sind mir - wenn auch verschachtelte - if-Konstrukte sehr viel lieber. 
Kann ja sein, daß nur ich und wenige Andere schlechte Erfahrungen mit 
der Kurzschreibweise gemacht habe.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

plex schrieb:
> Wie sieht es beim Debug aus? ... (und auch die Hilfsvariablen)

Hilfsvariablen optimiert der Compiler sowieso gnadenlos weg, auf die
brauchst du also beim Debuggen nicht zu zählen.

Wenn du dir Zwischenwerte fürs Debuggen merken willst, dann musst
du entweder den Code verfolgen (in welchem CPU-Register steht was?),
oder du legst dir eine temporäre Variable an, die du “volatile”
markierst, und lässt den Compiler dahin den Wert schreiben.

Gleiches trifft auf die verschachtelten if-Konstrukte zu: wie wir
oben schon gesehen haben, ist die Chance groß, dass sie ohnehin den
gleichen Code produzieren wie die ?:-Operatoren, damit ist auch
klar, dass sich beim Debuggen keins vom anderen unterscheiden wird.

Je neuer der Compiler und je besser die CPU, um so größer die Chance,
dass man nichts mehr „geradlinig“ debuggen kann.  „Bessere“ CPUs sind
hier Dinge wie ARM oder AVR im Vergleich zum alten i386, denn sie
haben deutlich mehr freie Register, die der Compiler nutzen kann.
Damit steigt aber die Chance, dass er eben auch im Codefluss deutlich
vom niedergeschriebenen C-Code abweichen kann.

: Bearbeitet durch Moderator
von Detlef K. (adenin)


Lesenswert?

Jörg Wunsch schrieb:
> „Bessere“ CPUs sind
> hier Dinge wie ARM oder AVR im Vergleich zum alten i386, denn sie
> haben deutlich mehr freie Register, die der Compiler nutzen kann.

Du vergleichst da zwei unterschiedliche Rechnerarchitekturen: CISC 
(i386) und RISC (ARM, AVR).
Das hat aber nichts mit "Besserer" CPU zu tun.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Detlef Kunz schrieb:
> Das hat aber nichts mit "Besserer" CPU zu tun.

Aber mit dem, was der Compiler im Codeablauf für Freiheiten genießt.
Daher habe ich das „besser“ auch in Anführungszeichen geschrieben.

Außerdem ist ein AVR nicht so ganz ernsthaft RISC (im Sinne der
ursprünglichen RISC-Definition), und auch ein amd64 hat deutlich
mehr freie Register für den Compiler als ein i386, obwohl er wohl
nun ganz eindeutig CISC ist.

von Peter II (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> und auch ein amd64 hat deutlich
> mehr freie Register für den Compiler als ein i386, obwohl er wohl
> nun ganz eindeutig CISC ist.

sicher?

so eindeutig ist das ganze schon lange nicht mehr.

Google: "i7 CISC oder risc"

von Torsten (Gast)


Lesenswert?

Hallo plex,

plex schrieb:

> Führt aber zu weniger Verwirrung und schnellerer Erfassung der Aufgabe
> des Codes.

das ist wirklich eine Übungssache. Anfänger können sich oft auch nicht 
die Operator precedence merken und machen dann vorsichtshalber mal um 
alles eine Klammer. Natürlich auch der Lesbarkeit wegen. Ein erfahrener 
Entwickler fragt sich, warum da Klammern sind, nimmt die Klammern in 
Gedanken weg und ist erstaunt darüber, dass die Klammer überflüssig 
waren und damit keine Aussage getroffen haben. Kleine Anekdote: Ein 
Kollege von mir hat immer Klammer um den Rückgabewert einer Funktion 
gemacht. Als er meinte, dass es so übersichtlicher wäre, habe ich Ihm 
gesagt, er solle zwei Klammern drum machen, damit es noch 
übersichtlicher wird ;-)

Also immer:
1
return ((result));

> Da kann man Kommentare
> auch gleich weglassen und sofort binär programmieren.

Das gleiche gilt für Kommentare. Wenn der Programmfluss mit Kommentaren 
erklärt werden muss, es also kein Mittel gibt, diesen auch ohne 
Kommentar klar erkennbar zu machen, dann ist das was "kompliziert". 
Redundante Kommentare neigen dazu, sehr schnell zu altern, mit dem 
Effekt, dass man dann Kommentare hat, die nicht mehr zu Code passen und 
man sich fragt, was von beiden nun richtig ist.

Den schlimmsten Kode, den ich bis jetzt gesehen habe, hat sich vor 
allem, durch viele Kommentare ausgezeichnet :-(

mfg Torsten

von Karl H. (kbuchegg)


Lesenswert?

Torsten schrieb:

> Kleine Anekdote: Ein
> Kollege von mir hat immer Klammer um den Rückgabewert einer Funktion
> gemacht.

Konsequenterweise müsste er dann auch schreiben
1
  i = ( 5 );

das ist dann genau aus dem gleichen Grund übersichtlicher :-)

von steffen (Gast)


Lesenswert?

Gut geschriebener C-Code ist selbsterklärend und braucht keine 
Kommentare:

http://www.ioccc.org/2011/goren/goren.c

von steffen (Gast)


Lesenswert?

Hier ist noch ein schöneres Programm:
http://www.ioccc.org/2011/hou/hou.c

von Norbert (Gast)


Lesenswert?

Karl Heinz schrieb:
>
> Konsequenterweise müsste er dann auch schreiben
>
1
   i = ( 5 );
>
> das ist dann genau aus dem gleichen Grund übersichtlicher :-)

Finde ich gut, da weiss man auf jeden Fall in welcher Reihenfolge die 5 
ausgewertet wird! ;-)

von bäh (Gast)


Lesenswert?

c ist eine Sprache oder eine Krankheit?
Zum Glück nicht Ansteckend!

von roehrenvorheizer (Gast)



Lesenswert?

Hallo Leute,

na, mit so einer Frage zu einem seltenen Operator kann man aber eine 
ganz schöne Lawine los treten!

Deshalb hier im Foto noch ein Beispiel für einen Operator oder einen 
anderen. Aus Zeiten vor C.

Danke für die Zuschriften auch der Moderatoren und die Erweiterung 
meines Wissens.
mfG

von Fer T. (fer_t)


Angehängte Dateien:

Lesenswert?

Also ich habe auch noch bisher keinen Fall erlebt wo ? oder if sich im 
Assembler unterschieden hätte (mit Optimierung an).
Sehe auch nicht den Grund warum das der Fall sein sollte, ich würde auch 
als Compiler ? und if gleichsetzen.

Ich persönlich nutze den ? Operator aber selber auch gerne, wenn auch 
eigentlich nur für bedingte Zuweisungen alla:

a = d < f ? d : f;

PS hab mal mein Beispiel angegangen (kompiliert mit gcc -O2 -S).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.