C-Anfängerfrage

buli

buli

Debianator
Hallo!
Ich hab grad angefangen, mich mit C zu beschäftigen.
doch schon am Anfang steh ich auf dem Schlauch.
Ich hab folgenden code aus meinem Büchlein kompiliert:

Code:
#include <stdio.h>

int main()
{
  int rechteck, laenge, breite;

  printf("Länge eingeben: ");
  scanf("%d", &laenge);

  printf("Breite eingeben: ");
  scanf("%d", &breite);

 rechteck = (laenge == breite);

  if (rechteck = 1)
{
  printf("Es handelt sich um ein Rechteck!\n");
}
  else if (rechteck = 0)
{
  printf("Es handelt sich nicht um ein Rechteck!\n");
}
return 0;
}

Aber es wird immer nur die erste Bedingung ausgegeben, egal was ich im Programm eingebe.

Dann hab ich den code wie folgt abgeändert:

Code:
#include <stdio.h>

int main()
{
  int laenge, breite;

  printf("Länge eingeben: ");
  scanf("%d", &laenge);

  printf("Breite eingeben: ");
  scanf("%d", &breite);

  if (laenge == breite)
{
  printf("Es handelt sich um ein Rechteck!\n");
}
  else if (laenge != breite)
{
  printf("Es handelt sich nicht um ein Rechteck!\n");
}
return 0;
}
Und siehe da:
es funzt.

In der Zeile aus dem ersten code rechteck = (laenge == breite);
sollen (laut Buch) die Variablen "laenge" und "breite" miteinander verglichen werden, und anschliessend das Ergebnis in der Variable "rechteck" gespeichert werden.
wahr=1 und falsch=0 , oder nicht?

Aber, warum funzt das nicht?
Ich hab den code 1000 mal nach Schreibfehlern untersucht, und der compiler meckert auch nicht.
Was kann da faul sein?
Vll mein Buch?:think:
 
kann es sein das du was vergessen hast normal sieht sowas so aus

<Variable> = (Bedingung ? TRUE-Zuweisung : FALSE-Zuweisung)

also

rechteck = (laenge == breite ? 1 : 0 );

setzt setzt rechteck auf 1 wenn Bedingung wahr sonst 0

Gruss tavgm
 
Auch nix.
Es handelt sich um ein Rechteck, es handelt sich um ein Rechteck, es handelt sich um ein Rechteck,...
X(
 
wieso hast du deine ifs nicht mit == gemacht ??
Das ist ein Vergelichsoperator und der wird denke ich immer so gemacht.

Gruss tavgm
 
dann stimmt da was in dem Buch net das definiert da einen neuen Vergleichsoperator ;)

Gruss tavgm
 
Das Buch ist von Stefan Heitsiek
Verlag: bhv
(nur, um anderen Leuten davon abzuraten)

Da stehen noch einige Sachen drin, die irgendwie nicht zusammenpassen.
Hat mich ne Menge Nerven gekostet.X(

Ist zwar von 2002, aber ne Programmiersprache ändert sich doch nicht einfach so, oder?
 
Hi,

Du hast eindeutig auf die falsche Bedingung abgefragt. In Deinem Fall nicht ob die Variable rechteck den Wert 1 hat, sondern ob die Zuweisung rechteck = 1 erfuellt ist (und das ist sie). Soweit ich weisz kann man das unter C benutzen um Arrays mit Werten zu befuellen ohne zu wissen wie grosz der Index sein darf (kann mich aber auch irren).

int i =0;
while (a = wert)
{
i++
}

So, oder so aehnlich.

Ein empfehlenswertes Buch: "Programmieren in C" von Kernighan, Ritchie

Ansonsten: "Linux Programmers Guide", "The GNU C Library Reference Manual"
 
Ich kenn das Buch nicht, aber ich kann mir nicht vorstellen, das da wirklich

Code:
if (rechteck = 1)

Das ist nämlich einer der häufigsten Anfängerfehler und wäre sehr peinlich für den Author.

Code:
if (rechteck = 1)

ist eine Zuweisung der Zahl 1 an rechteck und logischerweise immer wahr, weshalb man jedesmal in das if kommt.

= Zuweisung
== Test auf Gleichheit

Und du bist dir sicher das in dem Buch wirklich nur ein "=" steht?

Kann ich mir ehrlich gesagt kaum vorstellen, da das schon ein sehr grober und dazu noch offensichtlicher Schnitzer wäre...
 
ich kann mir net vorstellen das der Kompiler sowas net anmeckert ...
 
So funktioniert es:

#include <stdio.h>

int main()
{
int rechteck, laenge, breite;
printf("Länge eingeben: ");
scanf("%d", &laenge);
printf("Breite eingeben: ");
scanf("%d", &breite);
rechteck = (laenge == breite);
if (rechteck == 1)
{
printf("Es handelt sich um ein Rechteck!\n");
}
else if (rechteck == 0)
{
printf("Es handelt sich nicht um ein Rechteck!\n");
}
return 0;
}

Sonst setzt er die Variable gleich 1. == Hingegen ist der Vergleichsoperator und if wird ausgeführt, wenn die Bedingung wahr ist.

Sorry, dass es so "unhübsch" aussieht, aber ich weiß nicht wie man diese Kästchen hinbekommt.

EDIT
Ich hing wohl etwas zu lange beim editieren rum. Oben ist das jetzt schon erklärt
 
Zuletzt bearbeitet:
gut ich kenn mich net so mit C aus aber = ist ne Zuweisung
if wird in verbindung mit einem sog. Vergleichsoperator verwendet.
Der einen Ausdruck auf wahr falsch ueberueft.


Und da kann ich meinen Vorednern zu zustimmen das ist ein sehr sehr grober Fehler.

Gruss tavgm
 
So funktioniert es:

#include <stdio.h>

int main()
{
int rechteck, laenge, breite;
printf("Länge eingeben: ");
scanf("%d", &laenge);
printf("Breite eingeben: ");
scanf("%d", &breite);
rechteck = (laenge == breite);
if (rechteck == 1)
{
printf("Es handelt sich um ein Rechteck!\n");
}
else if (rechteck == 0)
{
printf("Es handelt sich nicht um ein Rechteck!\n");
}
return 0;
}

Sonst setzt er die Variable gleich 1. == Hingegen ist der Vergleichsoperator und if wird ausgeführt, wenn die Bedingung wahr ist.

Sorry, dass es so "unhübsch" aussieht, aber ich weiß nicht wie man diese Kästchen hinbekommt.
ne, passt schon!
Genau mit den gleichen Änderungen funzt es bei mir ja auch.
Nur, ich kapier den Unterschied nicht!

zwischen =
und ==
 
Lerne doch gleich C++. Wer C++ kann, kann auch C.
Ja, was man alles so liest.
C++ ist doch auf C aufgebaut, oder nicht?
Also muss ich doch erstmal das Fundament bauen, um den Dachstuhl aufzusetzen.
 
= ist ein Zuweisungsoperator. Wenn du zum Beispiel schreibst:

x = y
wird x der Wert von y zugewiesen.
x = 5 würde x den Wert 5 zuweisen.
Wenn du x dann über printf zum Beispiel abfragst gibt er dir 5 oder y wieder, je nachdem wie du es definiert hast.

x == y vergleicht x mit y.
ist x gleich y so wird der Ausdruck 1.
Alleine macht das wenig Sinn.
Aber mal zu deinem Beispiel:

rechteck = (laenge==breite)

Such dir mal eine Liste mit den Prioritäten der Operatoren.
Da ist == weiter oben angesiedelt als =.
Also wird zuerst der Vergleich laenge==breite ausgeführt.
Ist die laenge gleich breite wird der Ausdruck 1. Ist er ungleich wird er 0.
Diese 1 oder 0, je nachdem ob laenge==breite, wird dann rechteck zugewiesen.
Wegen der höheren Priorität von == könntest du die Klammern auch weglassen.
Wäre aber unübersichtlicher.

EDIT:
Bleib ruhig erstmal bei reinem C. Das reicht für den Anfang locker aus. Linux ist ursprünglich ja auch in reinem C geschrieben. Kannst damit also schon weit kommen.
Wenn du dich dann erstmal mit Strukturen, Arrays, Pointern usw auskennst kannst du auf C++ "updaten".
 
Zuletzt bearbeitet:
Beispiel:
x=1 (weise x den wert 1 zu)

== ist ein Vergleich, genauso wie < (kleiner als) oder > (größer als)usw.
5 == 2 Ist 5 = 2? Nein, also wird das als 0 (False) ausgewertet
5 == 5 Ist 5 = 5? Ja, wird also als 1 (True) ausgewertet


/*Edit*/
Ok, da war einer schneller, wärend ich das geschrieben hab *g*
 
= ist ein Zuweisungsoperator. Wenn du zum Beispiel schreibst:

x = y
wird x der Wert von y zugewiesen.
x = 5 würde x den Wert 5 zuweisen.
Wenn du x dann über printf zum Beispiel abfragst gibt er dir 5 oder y wieder, je nachdem wie du es definiert hast.

x == y vergleicht x mit y.
ist x gleich y so wird der Ausdruck 1.
Alleine macht das wenig Sinn.
Aber mal zu deinem Beispiel:

rechteck = (laenge==breite)

Such dir mal eine Liste mit den Prioritäten der Operatoren.
Da ist == weiter oben angesiedelt als =.
Also wird zuerst der Vergleich laenge==breite ausgeführt.
Ist die laenge gleich breite wird der Ausdruck 1. Ist er ungleich wird er 0.
Diese 1 oder 0, je nachdem ob laenge==breite, wird dann rechteck zugewiesen.
Wegen der höheren Priorität von == könntest du die Klammern auch weglassen.
Wäre aber unübersichtlicher.

EDIT:
Bleib ruhig erstmal bei reinem C. Das reicht für den Anfang locker aus. Linux ist ursprünglich ja auch in reinem C geschrieben. Kannst damit also schon weit kommen.
Wenn du dich dann erstmal mit Strukturen, Arrays, Pointern usw auskennst kannst du auf C++ "updaten".


Klasse antwort!
Damit kann ich was anfangen!

Danke, thobit!
Und auch allen anderen!
:)
 

Ähnliche Themen

C Code Hilfe!!! gesucht bei Dezimalzahl in Binärzahl for loop

Unix Webserver mit HTML Seite erstellen

Prozesskommunikation mit PIPES - wie funktioniert das?

GCC liefert in Eclipse Kompilierfehler

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Zurück
Oben