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 muss

    if( 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 !0

    The 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 ? 😃


Anmelden zum Antworten