Was gibt das folgende Programm aus?
-
Hallo! Hier noch eine Aufgabe, mit der unten aufgeführten Ausgabe als Lösung. Stimmt die Ausgabe? Ich hab eher erwartet das die Ausgabe "ungleich" lautet, weil 4≠6 ist. Was sagt ihr?
Was gibt das folgende Programm aus:
#include <stdio.h>
main()
{
long a = 6;
long b = 4;if (a = b)
printf("gleich\n");
else
printf("ungleich\n");
}Die Ausgabe lautet: "gleich", da 4 ≠ 0. Kann das sein???
-
Das = ist kein Vergleichs- sondern ein Zuweisungsoperator. Sonst müsste da == stehen. Das printf("gleich\n"); wird ausgeführt, wenn der Ausdruck a = b nicht gleich 0 ist. a wird 4 zugewiesen, ist somit nicht gleich 0 und somit wird das printf("gleich\n"); ausgeführt.
-
Damiroquai schrieb:
long a = 6; long b = 4; if (a = b)
a = b ist eine Zuweisung. Diese Zuweisung gibt 4 zurück, weil a der Wert von b, also 4, zugewiesen wird. Da 4 /= 0 ist die Aussage, die mit if geprüft wird, wahr.
Es mussif( a == b )
heißen. Das ist dann ein Vergleich, der Richtig oder Falsch zurück gibt.
-
Deine Antwort scheint richtig zu sein.
Die Ursache ist ein Schreibfehler, bzw wer so etwas mit Absicht macht gehört .....
Der Vergleich muss mit == gemacht werden
Was passiert hier
- a wird der Wert von b zugewiesen.
- a wird überpruft auf !0The if keyword executes statement1 if expression is true (nonzero); if else is present and expression is false (zero), it executes statement2. After executing statement1 or statement2, control passes to the next statement.
-
PAD schrieb:
Die Ursache ist ein Schreibfehler, bzw wer so etwas mit Absicht macht gehört .....
Man kann sich in seine Programmierkultur auch ein bisschen zu viel reinsteigern.
-
Ach naja. Unter Umständen kanns brauchbar sein, zum Beispiel
void my_strcpy(char *to, char const *from) { while(*to++ = *from++); }
-
Wenn ich richtig interpretiere brauct dein Einzeiler in der release Version
5 Befehle mehr als die lesbarere Variante MSVC 6.0 Releas Optimize speed?my_strcpy@@YAXPADPBD@Z PROC NEAR ; my_strcpy, COMDAT ; 152 : while(*to++ = *from++); * mov edx, DWORD PTR _from$[esp-4] * mov ecx, DWORD PTR _to$[esp-4] inc ecx * mov al, BYTE PTR [edx] inc edx * mov BYTE PTR [ecx-1], al test al, al je SHORT $L50064 $L50063: * mov al, BYTE PTR [edx] mov BYTE PTR [ecx], al * inc ecx * inc edx * test al, al * jne SHORT $L50063 $L50064: ; 153 : } ret 0 ?my_strcpy@@YAXPADPBD@Z ENDP ; my_strcpy ?my_strcpy2@@YAXPADPBD@Z PROC NEAR ; my_strcpy2, COMDAT ; 158 : do ; 159 : { ; 160 : *to++ = *from; * mov eax, DWORD PTR _from$[esp-4] * mov ecx, DWORD PTR _to$[esp-4] $L50069: * mov dl, BYTE PTR [eax] * mov BYTE PTR [ecx], dl ; 161 : } while(0 != *from++); * mov dl, BYTE PTR [eax] * inc ecx * inc eax * test dl, dl * jne SHORT $L50069 ; 162 : } ret 0 ?my_strcpy2@@YAXPADPBD@Z ENDP ; my_strcpy2
brauchbar ?