Почему char не воспринимается как цифра в C ++? - PullRequest
2 голосов
/ 15 апреля 2020

Я написал код в C, который отлично работал, я перевел его на C ++. Там это дало неправильный вывод. У меня была итерация, где я использовал и вход, и переменную итератора в качестве символа для экономии места. Но вел себя не так, как ожидалось.

unsigned char repeat, i;  
cin >> repeat;
for(i= 0; i < repeat; i++)

Какая эквивалентная строка для

scanf("%hhi", &repeat)

?

1 Ответ

5 голосов
/ 15 апреля 2020

Почему в C ++ символ char не принимается за цифру?

Поскольку C и C ++ являются разными языками программирования.

См., Например, n3337 , черновой стандарт C ++, практически эквивалентный C ++ 11 стандарт. Для языка программирования C11 см. n1570 и проект CompCert .

Язык программирования * спецификация Обычно написано в какой-то документации. Его семантика имеет такое же значение, как его синтаксис .

Если вы компилируете исходный код C ++ с каким-то недавним вариантом G CC, я предлагаю вызвать как g++ -Wall -Wextra -g, то есть включить много предупреждений и некоторой отладочной информации.

Рассмотрите также использование некоторых stati c программных инструментов анализа , например Frama- C или Clang stati c анализатор или Coverity et c ....

Читайте также Как отлаживать небольшие программы и около Неопределенное поведение

См. Также этот сайт о C и C ++ и посмотрите RefPerSys (некоторые "интересные "C ++ свободное программное обеспечение * проект 1059 *, в который я активно участвую, AGI ).

Изучите, по крайней мере для вдохновения, исходный код существующего C ++ open источник проектов. Qt или fi sh shell сразу приходит на ум (но тысячи других существуют на github или на gitlab или где-либо еще, например, Гуди , PPL , Инструментарий Fox , FLTK ). Вы многому научитесь, активно участвуя в одном из них (возможно, даже RefPerSys )

Кстати, я настоятельно рекомендую явно инициализировать каждую переменную Numberri c в C или в C ++ (так код unsigned char repeat=0, i=0; в вашем случае). Любой достаточно хороший оптимизирующий компилятор будет удалять их, когда они бесполезны, и отлаживать вашу программу (например, с помощью gdb, особенно в системах GNU / Linux например, Ubuntu или Debian ) будет проще, когда его поведение станет более детерминированным c.

...