Hallo,
ich bin noch Anfänger und hab ein Verständnisproblem bei der if()
Funktion mit ==
Ich nutzer den Cosmic Compiler für Freescale HCS12 Mikrocontroller.
Folgende if()-Abfrage funktioniert:
1
if((A&B)==0x00)
2
{
3
mach_was();
4
}
Wenn ich aber schreibe:
1
if(A&B==0x00)
2
{
3
mach_was();
4
}
Wird nie zu "mach_was();" gegangen, es sieht sogar so aus als ob das
weg-compiliert wird, ich kann da nicht mal einen Breakpunkt setzen in
der 2. Variante, in der 1. Variante kann ich einen Breakpunkt setzen.
Ich lese zum lernen im Kernighan/Ritchie und da steht auf Seite 41
eigentlich:
"Vergleiche haben geringeren Vorrang als arithmetische Operatoren. ..."
Ich verstehe das sicher falsch, aber es liest sich so, als wenn
eigentlich beide Varianten der if()... das gleiche Ergebnis bringen
sollten.
Martin N. schrieb:> Klammern beachten!> Im ersten Beispiel: wenn A UND B den Wert 0 ergibt ...> Im zweiten Beispiel: wenn A=1 ist UND B=0 ist ...
wenn es wirklihc stimmt das
> "Vergleiche haben geringeren Vorrang als arithmetische Operatoren. ..."
dann hätte ich dieses verhalten aucn nicht erwartet.
C-Anfaenger schrieb:> ... bei der if() Funktion
es gibt keine if-Funktion.
C-Anfaenger schrieb:> "Vergleiche haben geringeren Vorrang als arithmetische Operatoren. ..."
Eine korrekte Tabelle hilft mehr als Gerüchte:
http://www.wachtler.de/ck/11_Operatoren_Ausdrucke.html#sec:oper-und-ausdr> Ich verstehe das sicher falsch, aber es liest sich so, als wenn> eigentlich beide Varianten der if()... das gleiche Ergebnis bringen> sollten.
Nein, tun sie nicht.
== steht höher als &.
C-Anfaenger schrieb:
Moin Moin,
> ich bin noch Anfänger und hab ein Verständnisproblem bei der if()> Funktion mit ==>> Ich nutzer den Cosmic Compiler für Freescale HCS12 Mikrocontroller.>> Folgende if()-Abfrage funktioniert:>>
1
>if((A&B)==0x00)
2
>{
3
>mach_was();
4
>}
5
>
>> Wenn ich aber schreibe:>>
1
>if(A&B==0x00)
2
>{
3
>mach_was();
4
>}
5
>
>> Wird nie zu "mach_was();" gegangen, es sieht sogar so aus als ob das> weg-compiliert wird, ich kann da nicht mal einen Breakpunkt setzen in> der 2. Variante, in der 1. Variante kann ich einen Breakpunkt setzen.>> Ich lese zum lernen im Kernighan/Ritchie und da steht auf Seite 41> eigentlich:>> "Vergleiche haben geringeren Vorrang als arithmetische Operatoren. ...">> Ich verstehe das sicher falsch, aber es liest sich so, als wenn> eigentlich beide Varianten der if()... das gleiche Ergebnis bringen> sollten.
== bindet staerker als &.
Gruesse,
Michael
Liegt an Reihenfolge in der die Operatoren ausgeführt werde.
Oberster Prio haben Klammern. Dann kommen Vergleichsoperatoren, dann
Bit-Operatoren.
Wenn die Klammern drinn sind wird zuerst A&B ausgeführt, und dann
geprüft ob das Ergebnis == 0x00.
Lässt du die Klammern weg:
1. B==0x00
2. A & Ergebnis.
Die Auswertung in diesem falls ist also nur wahr wenn: B=0x00 und das
LSB von a 1 ist.
Schau dir mal eine Präzidenztablle von C an. Da steht die
auswertreihenfolge drinn.
Beste Grüße,
Stefan
Martin N. schrieb:> Klammern beachten!> Im ersten Beispiel: wenn A UND B den Wert 0 ergibt ...> Im zweiten Beispiel: wenn A=1 ist UND B=0 ist ...
Halb richtig. Das zweite Beispiel wird implizit so geklammert:
if( A & (B == 0x00))
{
mach_was();
}
Der if-Körper wird also ausgeführt, wenn B gleich 0 ist und das erste
Bit (bit 0) in A gesetzt ist.
Noch zur Ergänzung:
> "Vergleiche haben geringeren Vorrang als arithmetische Operatoren. ..."
Dein Buch hat durchaus Recht, allerdings handelt es sich bei & nicht um
einen arithmetischen Operator sondern um einen logischen.
+ und - haben Vorrang vor ==
und
== hat Vorrang vor & und |
Jan M. schrieb:> Dein Buch hat durchaus Recht, allerdings handelt es sich bei & nicht um> einen arithmetischen Operator sondern um einen logischen.
Doch, & und | sind arithmetische Operatoren, denn sie rechnen mit
Zahlenwerten. Die logischen Operatoren in C heißen && und ||.
Die nicht ganz nachvollziehbaren Präzedenzregeln für & und | haben
historische Gründe. Dennis Ritchie beschreibt hier die Zwickmühle, in
der er sich damals befand:
http://www.lysator.liu.se/c/dmr-on-or.html
Yalu X. schrieb:> Jan M. schrieb:>> Dein Buch hat durchaus Recht, allerdings handelt es sich bei & nicht um>> einen arithmetischen Operator sondern um einen logischen.>> Doch, & und | sind arithmetische Operatoren, denn sie rechnen mit> Zahlenwerten.
C spricht hier nicht von arithmetischen, sondern von bitweisen
Operatoren. Sie arbeiten ja auch nicht mit den Zahlenwerten, sondern nur
mit den einzelnen Bits.
Ich würde & und | nicht als arithmetische Operatoren betrachten.
Rolf Magnus schrieb:> Ich würde & und | nicht als arithmetische Operatoren betrachten.
Das ist Geschmackssache. Ich würde die bitweisen Operationen als eine
Teilmenge der arithmetischen betrachten.
Auf jeden Fall sind & und | für mich (und auch für den C-Standard) keine
logischen Operatoren, denn logische Operationen liefern immer "wahr"
order "falsch" (bzw. 1 oder 0), aber niemals eine Zahl wie 27583.
...das es immer noch Leute gibt, welche sich freiwillig diesen
unübersichtlichen und unvorhersehbare Resultate erzeugenden "C"-Unfug
antun... Dieser Treppenwitz der EDV-Geschichte sollte doch langsam ins
Kuriositätenkabinett verbracht werden und zukünftigen Generationen von
"Compilerbauern" und "Sprachkonstrukteuren" als abschreckendes Beispiel
dienen, wie man's nicht machen sollte!
(duck und wech ;-)
ernst schrieb:> ...das es immer noch Leute gibt, welche sich freiwillig diesen> unübersichtlichen und unvorhersehbare Resultate erzeugenden "C"-Unfug> antun... Dieser Treppenwitz der EDV-Geschichte sollte doch langsam ins> Kuriositätenkabinett verbracht werden und zukünftigen Generationen von> "Compilerbauern" und "Sprachkonstrukteuren" als abschreckendes Beispiel> dienen, wie man's nicht machen sollte!>> (duck und wech ;-)
Wird auch gut sein.
Nichts von alledem, was du da dahergebrabbelt hast, ist korrekt.
Yalu X. schrieb:> Rolf Magnus schrieb:>> Ich würde & und | nicht als arithmetische Operatoren betrachten.>> Das ist Geschmackssache. Ich würde die bitweisen Operationen als eine> Teilmenge der arithmetischen betrachten.
Viele Assembler-Dokumentationen sehen das anders. Da sind die
entsprechenden Instruktionen i.d.R. unter den logischen Instruktionen
einsortiert, oder sie sind - wie beim AVR - zusammen mit den Additionen
u.s.w. unter einer gemeinsamen Kategorie "arithmetische und logische
Instruktionen" zu finden.
> Auf jeden Fall sind & und | für mich (und auch für den C-Standard) keine> logischen Operatoren,
Für C sind sie auch keine arithmetischen.
> denn logische Operationen liefern immer "wahr" order "falsch" (bzw. 1> oder 0), aber niemals eine Zahl wie 27583.
Die arithmetischen Operationen dagegen interpretieren immer eine
Kombination mehrerer Bits als eine zusammenhängende Zahl. & und | tun
das nicht. Sie betrachten jedes Bit einzeln, unabhängig von den anderen.
Daß man den "bithaufen", der hinten rauskommt, dann wieder als Zahl
interpretieren kann, ändert daran nichts.
Klaus Wachtler schrieb:> #define if while
Das ist ja getürkt. So sieht eine richtige if-Schleife aus:
Klaus Wachtler schrieb:> Wie wäre es damit:
Bös Ressourcen fressend. Meine Version ist effizienter. Kommt (via GCC
-O) exakt der gleiche Code raus wie bei do..while.
A. K. schrieb:> Das war eine goto-Schleife.
Eine if-Schleife mit goto. ;-)
> Wenn du nicht glaubst, dass sei eine Schleife, dass zieh es mal durch> GCC.
Das ist keine Schleife, sondern Rekursion.
Rolf Magnus schrieb:> Das ist keine Schleife, sondern Rekursion.
ich vermute mal das es genau das nicht ist, dann es gibt keine lokalen
variablen der compiler macht daraus eine entlosschleife ohne calls
Peter II schrieb:> ich vermute mal das es genau das nicht ist, dann es gibt keine lokalen> variablen der compiler macht daraus eine entlosschleife ohne calls
In Prinzip korrekt, aber dank des if ist es keine Endlosschleife,
sondern do..while. Der Compiler ersetzt die Endrekursion. In der anderen
Variante ist es keine Endrekursion und daher ist auch der erzeugte Code
rekursiv.
Lothar Miller schrieb:> Klaus Wachtler schrieb:>> C-Anfaenger schrieb:>>> ... bei der if() Funktion>> es gibt keine if-Funktion.> Na gut, dann eben bei der if-Schleife... ;-)http://www.if-schleife.de/