2016-06-24 5 views
0

Ich habe eine Codezeile wie folgt aus:mehrere Zustand in if-Anweisung

for (ivalue=list[i];i>0 && list[i-1]>ivalue;i--) 
    ... 

die fein läuft. Aber wenn ich die Position der ersten Bedingung ändern i> 0 tritt mit Segmentation fault: 11 während des Laufens:

for (ivalue=list[i];list[i-1]>ivalue && i>0;i--) 
exits with Segmentation fault: 11 

Warum die Ergebnisse auf Position von Bedingungen abhängt, in & & Operator?

+2

'&&' Kurzschlüsse, wenn also die Prüfung auf 'i> 0 'fehlschlägt, wird' list [i-1] 'nicht ausgeführt und Sie werden kein Array mit einem negativen Index indizieren. –

Antwort

1

Ich kann annehmen, dass list[i-1] aus dem Array gebunden wird. Wenn Sie && den Code überprüfen Sie Ihre erste Bedingung verwenden und wenn es wahr ist es die zweite überprüfen, so im ersten Fall list[i-1] des Zugangs zu list[0] begrenzt ist, weil Sie zuerst i>0 überprüfen, während im zweiten Fall, dass Sie für die Überprüfung sind list[-1] vor dem i>0 überprüfen und das gibt Ihnen den Fehler!

1

Dies liegt daran, dass die zweite Bedingung nicht ausgewertet wird, wenn die erste Bedingung mit dem Operator && als falsch gewertet wird.

1

Wenn Sie mehrere Ausdrücke mit && verketten, in diesem Fall i>0 und list[i-1]>ivalue, wird nur das vorherige ausgeführt, wenn es als false ausgewertet wird.

Ihre zweite Ausdruck greift auf einen ungültigen Index sollte i kleiner als 1.

1

In Ihrem Fall list[i-1] Punkte zu ungültigen Speicher (Speicher Ihr Programm nicht zugreifen darf), und wenn der erste Teil einer && Aussage in der Bedingung wird als falsch ausgewertet, der zweite Teil wird niemals ausgeführt (Dies wird als Kurzschlussauswertung bezeichnet). Aus diesem Grund funktioniert das erste Beispiel (in einigen Fällen) gut, während das zweite Beispiel, bei dem tatsächlich auf list[i-1] zugegriffen wird, einen Segmentierungsfehlerfehler erhält.

Wikipedia hat auch einen schönen Artikel zur Kurzschlussauswertung.

2

Die Reihenfolge der Assoziativität von & & Operator wird vor i>0

wenn i = 0 die list[i-1]list[-1], die aus ist, wird somit die Überprüfung für list[i-1]>ivalue prüft zuerst, also es

links nach rechts gebunden und ergibt daher Segmentierungsfehler

HINWEIS: i>0 wird nie überprüft