2016-09-30 5 views
-3

der Code ist unten angegeben: es gibt Ausgabe True2.Bitte erläutern Sie die Ausgabe des angegebenen Programms.

#include<stdio.h> 
    int main() 
    { 
    int a=10; 
    if(a==a--) 
    printf("true 1\t"); 
    a=10; 
    if(a==--a) 
    printf("true2 \t"); 
    return 0; 
    } 
+2

Die Ausgabe * kann nicht erklärt werden, weil Sie [* undefiniertes Verhalten *] haben (https: // en. wikipedia.org/wiki/Undefiniertes_verhalten). Lesen Sie über [Evaluierungsreihenfolge und Sequenzierung] (http://en.cppreference.com/w/c/language/eval_order). –

+2

Dies ist ein sinnloser Müll, kein Code. (Es tut uns leid). Was soll es zeigen? –

+0

zur besseren Lesbarkeit und Verständnis, 1) konsistent den Code einrücken. Nach jeder öffnenden Klammer '{' einrücken. Unindent vor jeder schließenden Klammer '}'. 2) separate Code-Blöcke (für, wenn, sonst, während, tun ... while, switch, case, default) über eine leere Zeile – user3629249

Antwort

2

Der Vergleich in beiden der if Aussagen gemacht ergeben undefined behaviour. Also könnte alles passieren. Weil a ohne einen dazwischenliegenden Sequenzpunkt gelesen und geändert wird. Der Vergleichsoperator == führt keinen Sequenzpunkt ein. Sie müssen wahrscheinlich über undefined Verhalten und sequence points usw. lernen, um das Problem besser zu verstehen.

Moderne Compiler können Ihnen auch helfen. Zum Beispiel Fragen Clang:

warning: unsequenced modification and access to 'a' [-Wunsequenced] 
    if(a==a--) 
     ~ ^
warning: unsequenced modification and access to 'a' [-Wunsequenced] 
    if(a==--a) 
     ~^

für die beiden if Aussagen (GCC produziert auch ähnliche Warnungen mit gcc -Wall -Wextra).

0

Im Allgemeinen ist es keine gute Übung, a-- (oder --a) innerhalb einer Bedingung zu machen, weil es nicht klar zu lesen ist. Um den Unterschied zwischen a-- und -a zu verstehen, lesen Sie bitte die Antwort unter: Incrementing in C++ - When to use x++ or ++x?

+0

Die Frage ist über c –

+0

Ich weiß, aber es ist genau das gleiche in C und C++ – Idan

+0

Das hängt davon ab. Manchmal erhöht Pre- oder Postdecrement auch die Lesbarkeit. Aber das Problem hier ist nicht der Unterschied zwischen Pre- und Postdecrement, es ist "unsequenced Modifikation und Zugang", wie in der Antwort von @usr. – drRobertz

Verwandte Themen