2016-07-25 8 views
4

Я найти максимальное значение char путем простого добавления и тестирования, когда число становится отрицательным:Нахождение максимального значения обугленного в C

#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; 
} 

Тесты while петли впереди, так что первое время c+1 является отрицательный он ломается, и мы печатаем значение c. Однако программирование выводит отрицательное число!

Почему эта программа не выводит 127?

+0

Я использовал бы пределы.h для этого. Но если вы настаиваете, используйте int в качестве счетчика и сравните его с counter casted как char 'c! = (Char) c' – KIIV

ответ

4

В условном условном выражении присутствует неявный листинг, который заставляет сравнение работать с ints, а не с символами.

Если вы измените его на

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

то напечатает 127.

+4

Исправить ... кроме того, я думаю, что правильная терминология будет« целым продвижением », а не« неявным приведением ». ..? – phonetagger

+1

@phonetagger Спасибо за комментарий. Я понимаю, что цельное продвижение - это конкретный случай неявного литья, поэтому оба термина являются технически правильными. – bgoldst

+1

«Целое продвижение» доступно для поиска, если кто-то хочет узнать больше об этом – anatolyg

0

Signed integer overflow is undefined behavior. Это означает, что соответствующему компилятору C разрешено изменять c + 1 > 0 на true, так как добавление «не может» переполняться.

Это означает, что ваша программа может законно быть скомпилирована в бесконечный цикл.

+0

Хотя это может быть правдой, оно не объясняет поведения, наблюдаемого ОП. – phonetagger

+0

Это не определено, если 'INT_MAX == CHAR_MAX'. – EOF

+1

@EOF - Я не уверен, что это правильно. Правая часть выражения 'c + 1' имеет тип' int', а его левая сторона - меньший, поэтому весь результат этого выражения является 'int'. Поэтому сравнение 'c + 1> 0' является одним' int' по сравнению с нолем (другое 'int', но специальное). – phonetagger