www.mikrocontroller.net

Forum: PC-Programmierung Was bedeutet diese C Zeile


Autor: Hans Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ucFCWrite = ((urFlow & UI_FLOW_MASK) ? X_TRUE : X_FALSE);

ich verstehe eigentlich folgendes nicht:

? X_TRUE : X_FALSE);

Danke

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eine verkürzte Schreibweise für

if(urFlow & UI_FLOW_MASK)
  X_TRUE;
else
  X_FALSE;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Stefan schrieb:
> ucFCWrite = ((urFlow & UI_FLOW_MASK) ? X_TRUE : X_FALSE);
>
> ich verstehe eigentlich folgendes nicht:
>
> ? X_TRUE : X_FALSE);

Dann solltest du dir ein C-Buch zulegen.
Das ist der ternäre Vergleichsoperator


  d = a ? b : c

ist gleichwertig zu

  if( a )
    d = b;
  else
    d = c;

Autor: Sven Bohner (sbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das kann man auch so schreiben:

if(urFlow & UI_FLOW_MASK)
    ucFCWrite = X_TRUE;
else
    ucFCWrite = X_FALSE;


dh.: (Ausdruck) ? (wenn_wahr) : (wenn_falsch);

wenn der Ausdruck wahr ist, dann gilt das element vor dem Doppelpunkt, 
wenn nicht, dann der nach dem Doppelpunkt...

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eine verkürzte Schreibweise für

if(urFlow & UI_FLOW_MASK)
  ucFCWrite = X_TRUE;
else
  ucFCWrite = X_FALSE;

Autor: Hans Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow das ging schnell.

besten Dank

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist übrigens nicht ganz eine verkürzte Schreibweise. Nur auf den 
ersten Blick ;)

Hier kann man nämlich kein if einbauen.
#define DEBUG 1

const char blubb = DEBUG ? '5' : 'x'

int main()
{
    ...

    return 0;
}


Hoffe jetzt keinen Mist geschrieben zu haben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. schrieb:

> Hoffe jetzt keinen Mist geschrieben zu haben.

Nein, hast du nicht.

Der wesentliche Unterschied zwischen den beiden Formen ist, dass es sich 
bei ?: um einen echten Operator handelt, der in arithmetischen 
Ausdrücken verwendet werden kann.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. schrieb:

> Hoffe jetzt keinen Mist geschrieben zu haben.

Nur nen Syntaxfehler ;)

Autor: Deutschversteher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Hoffe jetzt keinen Mist geschrieben zu haben.
> Nur nen Syntaxfehler ;)

Eigenbezug oder Sofort-Aufforderung an den Leser? :-D

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. schrieb:
> Simon K. schrieb:
>
>> Hoffe jetzt keinen Mist geschrieben zu haben.
>
> Nur nen Syntaxfehler ;)

Stimmt! ;)

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. schrieb:
> Hier kann man nämlich kein if einbauen.
Meinste nich?
#define DEBUG 1

const char blubb = 
#if DEBUG
'5'
#else
'x'
#endif
;

Ist erlaubt :-)

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Präprozessor #if ist ja nicht das Gleiche Du Schelm :-)

Autor: jl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
böse, böse, böse ...

ich mag sowas nicht. Vor allem wenn es in macros verwendet wird und 
diese sich dann schachteln. nach 5 Fragezeichen im macro (preprozessor 
output) sieht man überhaupt nicht mehr durch. Und solchen Code musste 
ich mal auf fehler überprüfen.

Ist nett wenn es sehr einfach gehalten ist und sofort einsehbar, aber 
if/else ist auch nicht soviel länger.

JL

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sach dazu nur: Es leben die C++-Templates, sie leben hoch:
    d:\src\cl\demo>c++2 rtmap.cpp
    rtmap.cpp: In function `int main()':
    rtmap.cpp:19: invalid conversion from `int' to `
       std::_Rb_tree_node<std::pair<const int, double> >*'
    rtmap.cpp:19:   initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref,
       _Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val =
       std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr =
       std::pair<const int, double>*]'
    rtmap.cpp:20: invalid conversion from `int' to `
       std::_Rb_tree_node<std::pair<const int, double> >*'
    rtmap.cpp:20:   initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref,
       _Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val =
       std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr =
       std::pair<const int, double>*]'
    E:/GCC3/include/c++/3.2/bits/stl_tree.h: In member function `void
       std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::insert_unique(_II,

       _II) [with _InputIterator = int, _Key = int, _Val = std::pair<const int,
       double>, _KeyOfValue = std::_Select1st<std::pair<const int, double> >,
       _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int,
       double> >]':
http://www.bdsoft.com/tools/stlfilt.html

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leute die ternäres Zeug verwenden sollten auch diese sources problemlos 
verstehen:
http://www.de.ioccc.org/years.html

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ucFCWrite = ((urFlow & UI_FLOW_MASK) ? X_TRUE : X_FALSE);

>ich verstehe eigentlich folgendes nicht:

>? X_TRUE : X_FALSE);
>-----------------------------------------------------------------
>Das ist eine verkürzte Schreibweise für

>if(urFlow & UI_FLOW_MASK)
>  X_TRUE;
>else
>  X_FALSE;


if urFlow & UI_FLOW_MASK then
  ...
else
  ...
end if


Was liest sich angenehmer?  Ein Compiler macht das gleiche draus!

das böse Basic!

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<offtopic>

Jaja, geh du mit deinem Basic erstmal Array und Vektoren durch.
dim x, y
x = EineFunktion(3)
y = EinVektor(3) 'Na, was verwechselt sich besser?

Soviel zum pösen Basic.

Wer bei so simplen Sachen wie dem IF in C schon mit Basic und andren 
vergleicht und meint, die anderen ließen sich leichter lesen... sorry, 
der soll bitte wieder in den Kindergarten und die Finger vom 
Programmieren lassen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Z8 schrieb:

> Was liest sich angenehmer?  Ein Compiler macht das gleiche draus!

Das hier
  DrawItem( x, y,
            Background   == DoDraw ? Opaque : Transparent,
            Color        == White  ? Black : Color,
            Item->type() == Line   ? DrawCaps : DrawStraight );

liest sich um einiges angenehmer als

  drawFlag tempFlag = Opaque;
  if( Background == DoDraw )
    tempFlag = Transparent;

  color tmpColor = Color;
  if( Color == White )
    tmpColor = Black;

  endType tmpType = DrawCaps;
  if( Item->type() == Line )
    tmpType = DrawStraight;

  DrawItem( x, y, tmpFlag, tmpColor, tmpType );

oder gar, Gott bewahre, eine geschachtelte if-then-else Leiste.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So einen Fall könnte man sogar mit einem goto in C noch eleganter 
programmieren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.