@Dirk
Es wird erst zugewiesen und dann wird für die if-Anweisung die zugewiesene Variable ausgewertet. Die Zuweisung selbst wird für die if-Abfrage gar nicht betrachtet. Es passiert also eigentlich
if ( i = 1)
ist äquivalent zu:
i = 1
if (i)
und es gilt, wie crashmaster schon schrieb, 0 wird als false interpretiert und nicht-0 wird als true interpretiert, da booleans technisch ohnehin genauso abgespeichet werden.
Dementsprechend wird in diesem Beispiel der if-Block immer angesprungen. "Prüfte" man auf "i = 0" würde der if-Block nie angesprungen.
In den allermeisten Fällen möchte man bei if (i = 1) aber if (i == 1) haben, sonst hätte man es entsprechend anders geschrieben, wegen Codelesbarkeit. Dass der Compiler da keinen Fehler gibt, ok, ist ja syntaktisch, aber zumindest eine standardmäßige Warnung finde ich sinnvoll, weil 99% der Leute, die if ( i = 1 ) schreiben das nicht so meinen (weil die if-Abfrage dann auch völlig sinnfrei ist).
Das geht bspw. in Java nicht, dort fordern Stellen, an denen ein boolean ausgewertet wird, auch einen boolean, ein Integer wird nicht akzeptiert oder muss explizit durch einen Wrapper zu einem boolean gemacht werden, was die Sprache gerade für Anfänger angenehmer macht.
Gibt halt nur leider ein paar andere Downsides an Java, die der Praxistauglichkeit ein wenig abträglich sind. Aber als Lernsprache und für kleinere Projekte imho super. GUIs programmieren ist mit Java zwar immer noch zum Kotzen, aber immerhin weniger zum Kotzen (was immer noch zum Kotzen ist, aber gut... 😉)