2016-07-25 30 views
4

ich den Maximalwert eines char durch einfache Addition und Prüfung finden bin für, wenn die Zahl negativ wird:max-Wert von char in C Finding

#include<stdio.h> 

/*find max value of char by adding*/ 
int main(){ 
    char c = 1; 

    while(c + 1 > 0) 
    ++c; 

    printf("Max c = %d\n",(int)c); /*outputs Max c = -128*/ 
    return 0; 
} 

Die while Tests Schleife voraus, so das erste Mal c+1 ist negativ es bricht und wir drucken den Wert c. Die Programmierung gibt jedoch die negative Zahl aus!

Warum gibt dieses Programm 127 nicht aus?

+0

Ich würde limits.h dafür verwenden. Aber wenn du darauf bestehst, benutze int als Zähler und vergleiche es mit dem Zähler, der als char 'c! = (Char) c' – KIIV

Antwort

4

Es gibt eine implizite Umwandlung in der while-Bedingung, die bewirkt, dass der Vergleich mit ints und nicht mit Zeichen arbeitet.

Wenn Sie es ändern zu

while((char)(c + 1) > 0) 
    ++c; 

dann wird es 127.

+4

Richtig geschrieben wird ... außer ich denke, die korrekte Terminologie wäre" ganzzahlige Werbung ", nicht" implizite Umwandlung ". ..? – phonetagger

+1

@phonetagger Danke für den Kommentar. Meines Erachtens ist Integer-Promotion ein spezifischer Fall von implizitem Casting, daher sind beide Begriffe technisch korrekt. – bgoldst

+1

"Integer promotion" ist suchbar, falls jemand mehr darüber erfahren möchte – anatolyg

0

Signed integer overflow is undefined behavior drucken. Dies bedeutet, dass ein konformer C-Compiler c + 1 > 0 zu true ändern darf, weil der Zusatz "nicht" überlaufen kann.

Dies bedeutet, dass Ihr Programm legitim zu einer Endlosschleife kompiliert werden konnte.

+0

Obwohl dies zutreffen mag, erklärt es nicht das Verhalten, das das OP beobachtet hat. – phonetagger

+0

Dies ist nur undefiniert, wenn 'INT_MAX == CHAR_MAX'. – EOF

+1

@EOF - Ich bin mir nicht sicher, ob das stimmt. Die rechte Seite des Ausdrucks "c + 1" hat den Typ "int" und seine linke Seite ist ein kleinerer Typ, so dass das gesamte Ergebnis dieses Ausdrucks ein "int" ist. Also ist der Vergleich 'c + 1> 0' ein 'int' im Vergleich zu Null (ein anderes 'int', aber ein spezieller). – phonetagger