erste gehversuche in C

0664jester

Mitglied
#include <stdio.h>

#define SUM(a,b) a + b
#define HALF(a) a/2

int main (int argc, char *argv[])
{
int klein = 3;
float gross = 6.0;
printf("Der Mittelwert ist %d", HALF(SUM(gross, klein)));
return 0;
}


irgendwie bekomme ich da 7 raus.

Kann mir bitte jemand helfen, wie man das macht?
 
Zuletzt bearbeitet:
Hallo,

erstmal bitte demnächst Codetags verwenden, für die lesbarkeit.

Das Ergebnis ist völlig richtig. Markos sind keine Funktionen, dh du kannst sie hier nicht so verwenden, wie du es gerne Hättest. Makros werden einfach nur vom Präprozessor eingesetzt, als hättest du das genau so geschrieben. Und erst danach wird kompiliert. Wenn du nun also einsetzt erhälst du den Ausdruck:

HALF(SUM(gross, klein)) => gross + klein / 2

Du müsstest also um das a+b Klammern setzen im Makro.

Generell würde ich dir aber empfehlen auf Marko-Funktionen zu verzichten. Sie richten mehr Schaden an als sie Nutzen haben außerdem sind die Seiteneffekte nicht berechenbar oder nachvollziehbar, wie hier.

Grüße,
Jennesta
 
Hallo

Zudem sollte vermerkt werden, dass du nur einen ganzzahligen Wert bekommen kannst. 4.5 ist mit diesem Code nicht.
Nimm entweder alle als float und ändere %d in %f oder caste auf float.

Gruss
cwriter
 
danke fuer die antworten. :)

ich habe noch eine frage:

if((value & (value-1)==0)
{
printf("Wann werde ich ausgefuehrt?"
}

Wie sind da die Prioritaeten bei den klammen und bitooperatoren?
 
Die korrekte Antwort ist: Gar nicht. Der Compiler wird den Build abbrechen. Grund: 3 offene Klammern, 2 geschlossene.
Grundsätzlich gelten aber auch hier die Klammergesetze der Mathematik.
In deinem konkreten Fall, wenn 7 Nullen 8 Einsen gegenüberstehen (im Fall eines chars. Int wäre dasselbe mit 32 Einsen.

Gruss
cwriter
 
@sheel
Vielleicht setze ich damit gleich meinen Failtrain fort, aber ist & nicht AND und funktiert so, dass 0 0 = 1; 0 1 =0 und 1 1 = 1 ist?
Ungerade hätte aber mehr Einsen drin...

Gruss
cwriter

EDIT:
Eigentlich geht ja nur 1 und 2, oder? Schon bei 3 ist das Resultat ja 2...
 
Zuletzt bearbeitet:
Nein nein, ich selbst habe deinen Failtrain ganz grandios fortgesetzt,
in dem ich abwechselnd in & und | gedacht habe :p
(was Failtrain, macht doch nichts :)
Deswegen wird hier diskutiert, damit wir uns gegenseitig ausbessern...)

Die (jetzt hoffentlich) korrekte Antwort ist:
Wenn man ganz sicher gehen will kann man diese Frage nicht beantworten,
weil der Standard hier etwas nicht regelt.
Wenn man das als Gegeben nimmt, was Compiler tun:
Das if wird nur dann ausgeführt, wenn value 1 ist. Sonst nie.


8 Stück Vorwissen für den Beweis :p

In C, C++ (und noch einigen anderen Sprachen) gilt die Zahl 0 als Falsch bzw. Nein
und jede andere Zahl (egal ob positiv oder negativ) als Wahr bzw. Ja.

Ein if kann die Bedingung drin nicht wirklich auswerten,
sondern die Bedingung ist eigentlich eine Rechnung, die am Ende 0 oder nicht ergibt.
== und Ähnliches Verrechnen zwei Zahlen genauso wie + und -
Nach Verrechnen der Bedingung hat man entweder if(0), das wird nicht ausgeführt,
oder eine andere Zahl, dann wird der Codeblock ausgeführt.

Der Operator == für je eine Zahl links und rechts hat eine einzelne Zahl als Ergebnis,
so wie + auch aus zwei Zahlen eine macht. Klar.
Die Frage ist, welchen Wert.
Wenn die zu vergleichenden Zahlen nicht gleich sind ergibt das Ganze 0 für Falsch,
das ist immer so. Wenn die Zahlen aber gleich sind wäre jeder Wert außer 0 gültig für Wahr
Wenn einfach sowas wie "if(==b)" dasteht ist egal, welcher konkrete Wahrwert rauskommt,
das if wird immer ausgeführt. Wenn man aber mit dem Wert math. weiterrechnen will...
Das ist die Sache, die im Standard nicht festgelegt ist.
Übliche Compiler nehmen hier 1 für Wahr, aber 2 oder 255 oder -1 oder ... wären auch erlaubt.
Die Ausgangsfrage kann man konkret beantworten, wenn man 1 annimmt,
aber nicht pauschal für jede Zahl.
Also, eigentlich unbeantwortbar, aber ich nehme 1 an.

Das logische Und "&&" ergibt dann Wahr,
wenn beide zu verrechnenden Werte Wahr (nicht Null) sind.
Insgesamt, über das ganze int/char...
Bitschreibweise:
01011110 &&
11010010 =
00000001
weil NichtNull && NichtNull
(hier gilt wieder die Annahme, das ein generierte Wahr genau 1 ist)

Das binäre Und "&" macht das Selbe pro Bit der Zahlen.
01011110 &
11010010 =
01010010
Nur, wenn beide Bits auf einer Stelle 1 sind ist das Ergebnisbit auch 1.

Mathematische Klammern () werden auf jeden Fall beachtet,
egal ob in Rechnungen oder if´s.

Reihenfolge der Abarbeitung von Operatoren, wenn keine Klammern da sind:
Es gibt Tabellen zum Nachschauen.
+ wäre vor == dran (zum Beispiel), aber:
& kommt nach ==
(falls es nicht passend geklammert wurde)

-------

Um auf die Ausgangsfrage zurückzukommen:
if(value & (value-1) == 0)

a) value ist 1 (ich behaupte, nur dann gehts)
if(value & (value-1) == 0)
if(1 & (1-1) == 0)
if(1 & (0) == 0)
if(1 & 0 == 0)
if(1 & 1)
Binär:
if(00000001 & 00000001)
if(00000001)
Dezimal:
if(1)
Wahr, wird ausgeführt

b) value ist nicht 1
if(value & (value-1) == 0)
if(value & (nichtnull) == 0)
if(value & 0)
Jedes Bit "und falsch" ist pro Bit immer Falsch (0)
Binär alles Nuller ist dezimal auch 0...
if(0)
Falsch
 
Hallo

Ist es nicht einfach value = 2^n? (Vielleicht ist auch deines richtig, bin gerade ziemlich im Vollrausch ;-) )
Ein Beispiel:
100 (4)
011 (3)
000 (0)

Oder auch
1000 (8)
0111 (7)
0000 (0)

Gruss
cwriter

@sheel
Es ist ja nicht if(0), sondern if( 0 == 0), also true, nicht?
 
Wäre erstmal die Frage ob man die überschüssige Klammer weglässt oder die fehlende Klammer dazuschreibt. Ich würde davon ausgehen, das dort stehen sollte:
C:
if ((value & (value - 1)) == 0) ...
 
Zurück