If..elseif..else?

Hi,

ich C++ scheint es keine elseif-Anweisung zu geben.
switch…case:-akzepteirt nur genzzahlige werte und meinen eingegebenen String einzeln zu prüfen, mit je einer if-Abfrage, will ich eigendlich nicht, da ich so kein generelles else bekomme.
Wie geht das in C++??
Die Hilfe bzw das Handbuch sagen mir dazu nichts.

cu Desian

Hallo Desian,
Die Lösung heisst verschachtelte Bedingungen!
Dies ist doch ganz einfach und funktioniert in jeder Programmiersprache!
(Hmmm… Vielleicht wäre ein C/C++ Buch doch nicht schlecht :wink:

if (a) {
}
else {
 if (b) {
 }
 else {
 if (c) {
 }
 else {
 }
 }
}

Achtung auf die geschweiften Klammern.

Gruss, Simon

Achtung auf die geschweiften Klammern.

Habe ich gesagt und prompt war eine Klammer zuviel.
} nach erstem if weglassen!

Achtung auf die geschweiften Klammern.

Habe ich gesagt und prompt war eine Klammer zuviel.
} nach erstem if weglassen!

Kommando zurück. Bin wohl etwas verwirrt heute. Der Code war schon richtig!

Das:
if(){}
else if(){}
else if(){}
else{}
kam von anderer Seite und funktioniert.
Danke aber für die Antwort.

cu Desian

Moin,

ich C++ scheint es keine elseif-Anweisung zu geben.

C und C++ zeichnen dadurch aus, daß es nichts Überflüssiges gibt. Nimm ‚else if‘ statt ‚elseif‘.

Thorsten

Hi Desian :smile:

if() {}
else if() {}
 else if() {}
 else {}

ist eine sog. „if-else-Leiter“. In C ist so was aber gefährlich, weil ein „else“ immer zum letzten else-losen „if“ gehört. Die geklammerte Version ist dagegen absolut sicher:

if() {}
else { if(){} }
 else { if(){} }
 else {}

Und es stimmt, ein C++ Buch ist eine feine Sache :smile:))

cu Stefan.

Hi,

ich weiss ja nicht, was Du vorhast, aber hilft Die vielleicht sowas:

#include
#include
#include

void main(void) {
vector patterns;

patterns.push_back(„Hund“); patterns.push_back(„Katze“);
patterns.push_back(„Maus“);

string testThis(„Mundze“);
int found = -1;

for(unsigned i = 0; i

> if() {}  
> else { if(){} }  
> else { if(){} }  
> else {}

Hi Stefan,

Die Syntax if () {} else {} else {} else {} ist in C++ nicht definiert !
Gemeint hast Du vielleicht:

if () {}
else
{
 if() {}
 else 
 { 
 if() {} 
 else {} 
 }
}

Gruß Frank

Hi Frank :smile:

Ich werde alt! Du hast natürlich Recht, genau das habe ich gemeint. Vielleicht sollte ich nochmal ein C++ Buch zur Hand nehmen :smile:))

cu Stefan.

Moin,

Die geklammerte Version ist dagegen absolut sicher:

> if() {}  
> else { if(){} }  
> else { if(){} }  
> else {}

Absolut sicher, so so.

Thorsten

Moin,

etwas anderes läßt sich aus der Diskussion noch lernen:
Benutze immer Blöcke nach if und else.

Es gibt übrigens ein gutes Buch, daß einem hilft, solche Dinge klarer zu sehen: The C Puzzle Book.

Thorsten

Hi Thorsten :smile:

Was soll mir jetzt dein Artikel sagen? Ich habe halt zu schnell geantwortet und mich vertan, kann doch mal passieren, oder? Ich kann halt noch nicht so toll programmieren wie du!

Aber an dem Inhalt meiner Aussage ändert sich nichts: Nur die korrekt(!) geklammerte Version ist absolut sicher, weil eben ein else immer zum letzten else-losen if gehört …

cu Stefan.

Moin,

Was soll mir jetzt dein Artikel sagen?

Daß man Wörter wie ‚absolut sicher‘ nur benutzen sollte, wenn man sich absolut sicher ist.

Ich kann halt noch nicht so toll programmieren wie du!

Du weißt garnicht, wie toll ich programmieren kann. Ich habe auch nur eine kurze spitze Bemerkung gemacht, weil Du Dir absolut sicher warst. Kein Grund zur Aufregung.

Aber an dem Inhalt meiner Aussage ändert sich nichts: Nur die
korrekt(!) geklammerte Version ist absolut sicher, weil eben
ein else immer zum letzten else-losen if gehört …

Schaun wa mal: Wenn Du tatsächlich s/elseif/else if/g benutzt, also blind ersetzt, bekommst Du folgende Struktur:

if (Bedingung1)
 Block
else if (Bedingung2)
 Block
else if (Bedingung3)
 Block
else
 Block

Der Vorteil von C (zB. im Gegensatz zu Perl) ist nun, daß nach if oder else ein beliebiger Ausdruck folgen kann, also auch eine neue if…else-Gruppe. Da aber die gesamte if-else-Gruppe genau ein Ausdruck ist, landet jedes else automatisch beim richtigen if.
Das kannst Du mit Klammern unterstützen, wenn Dir das lieber ist, aber Du siehst ja, was dabei herauskommen kann. Ich möchte denn auch meine andere Nachricht einschränken: In einer solchen Struktur würde ich nur für die Blöcke Klammern benutzen (da aber auf jeden Fall, auch wenn der Block nur einen Ausdruck enthält), nicht für die geschachtelten ifs. Dadaurch bekommt man genau das, was man erwartet.

Thorsten

Hi Thorsten :smile:

Schaun wa mal: Wenn Du tatsächlich s/elseif/else if/g benutzt,
also blind ersetzt, bekommst Du folgende Struktur:

> if (Bedingung1)  
> Block  
> else if (Bedingung2)  
> Block  
> else if (Bedingung3)  
> Block  
> else  
> Block

Was ist denn, wenn ein Block aus einer einzigen if-Bedingung besteht, also etwa:

if (Bedingung1)
 Block
else if (Bedingung2)
 if (Unter-Bedingung) { ... }
else if (Bedingung3)
 Block
else
 Block

Jetzt tritt genau der Fall ein, den ich meine. Der C-Compiler interpretiert das dann so (Ich habe jedes else unter das entsprechende if geschrieben):

if (Bedingung1) Block
else if (Bedingung2)
 if (Unter-Bedingung) { ... }
 else if (Bedingung3) Block
 else Block

und nicht, wie er eigentlich sollte:

if (Bedingung1) Block
else if (Bedingung2)
 { if (Unter-Bedingung) { ... } }
 else if (Bedingung3) Block
 else Block

Deswegen ist die Form

if (Bedingung1)
 { Block }
else if (Bedingung2)
 { Block }
else if (Bedingung3)
 { Block }
else
 { Block }

einfach sicherer!

cu Stefan.

Moin,

> > if (Bedingung1)  
> > Block  
> > else if (Bedingung2)  
> > Block  
> > else if (Bedingung3)  
> > Block  
> > else  
> > Block

Was ist denn, wenn ein Block aus einer einzigen if-Bedingung
besteht

  1. Wer lesen kann (und sauber zitiert), ist klar im Vorteil:

In einer solchen Struktur würde ich nur für die Blöcke
Klammern benutzen (da aber auf jeden Fall, auch wenn
der Block nur einen Ausdruck enthält), nicht für die
geschachtelten ifs.

  1. Wer lesen kann, ist klar im Vorteil: Da steht Block, ein Block besteht aus zwei Klammern, zwischen denen sich beliebig viele Ausdrücke tummeln.

Deswegen ist die Form

> if (Bedingung1)  
> { Block }  
> else if (Bedingung2)  
> { Block }  
> else if (Bedingung3)  
> { Block }  
> else  
> { Block }

einfach sicherer!

Ich würde Blöcke nicht ein zweites mal klammern, ansonsten ist das genau das, was ich Dir nahelegen will.

Thorsten

Hi Thorsten :smile:

Eben, wer lesen kann ist klar im Vorteil. Genau das meine ich ja die ganze Zeit, dass man die Anweisungen hinter den if’s immer schön klammern sollte. Das habe ich schon vor zig Postings gesagt, ich habe mich nur bei der Syntax verschrieben.

Ich dachte, du würdest etwas anderes meinen, weil sonst schon dein vorletztes Posting keinen Sinn mehr gemacht hätte …

cu Stefan.

Hi Thorsten :smile:

etwas anderes läßt sich aus der Diskussion noch lernen:
Benutze immer Blöcke nach if und else.

Naja, hinter „else“ braucht man bei der if-else-Leiter eigentlich keine Blöcke. Das ist nur unnötige Tipparbeit. Es reicht völlig, Blöcke nur hinter den if’s zu verwenden!

cu Stefan.

Moin,

etwas anderes läßt sich aus der Diskussion noch lernen:
Benutze immer Blöcke nach if und else.

Naja, hinter „else“ braucht man bei der if-else-Leiter
eigentlich keine Blöcke.

Das habe ich schon relativiert.

Das ist nur unnötige Tipparbeit.

Was für ein dämliches Argument. Läßt Du auch ‚\n‘ aus, weil das unnötige Tipparbeit ist?

Thorsten

Moin,

Eben, wer lesen kann ist klar im Vorteil. Genau das meine ich
ja die ganze Zeit, dass man die Anweisungen hinter den if’s
immer schön klammern sollte.

Warum sagst Du’s dann nicht bzw. versuchst, meine Version zu widerlegen?

Ich dachte, du würdest etwas anderes meinen, weil sonst schon
dein vorletztes Posting keinen Sinn mehr gemacht hätte …

Wie bitte? Was ich schreibe stimmt, also nimmst Du an, daß ich etwas meine, was ich nicht schreibe, damit Du sagen kannst, daß das, was ich schreibe, falsch ist? Habe ich das in etwas richtig nachvollzogen?

Gute Besserung!

Thorsten