в то время как (cin >> значение) прерывает цикл, когда я ввел символ - PullRequest
0 голосов
/ 07 апреля 2019

Раньше я программировал на c #, но сейчас я изучаю c ++. Почему цикл while завершается в c ++ при вводе строки и в c #, если я не использую tryparse, это даст исключение. С ++ явно делает что-то вроде tryparse в бэкэнде? Извините если мой вопрос Я использую кодовые блоки в качестве моей C ++ IDE.

Я читаю простые числа в книге c ++ и кодирую простую программу, которая непрерывно принимает целое число в качестве входных данных до тех пор, пока не будет введена строка. Я написал тот же код на C #, но это приводит меня к ошибке. Поэтому я должен использовать метод tryparse в C #.

int value = 0;

В С ++

while( cin >> value );

In C #

while( value  == int.parse(Console.ReadLine());

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Почему цикл while завершается в c ++ при вводе строки

operator>> выполняет внутреннюю обработку ошибок.Если ему не удается извлечь целое число, поток переходит в состояние сбоя, и цикл проверяет состояние потока, поэтому он завершается при сбое потока.

в c #, если я не использую tryparseэто выдаст исключение.

Да, потому что именно так int.parse() определен для работы.

Подобное поведение в C ++ можно получить с помощью включение исключений в потоке .Таким образом, если происходит сбой извлечения, выдается исключение std::ios_base::failure.

Делает ли c ++ явно что-то вроде tryparse в бэкэнде?

В некотором смысле, да.

Я читаю простые числа c ++ и пишу простую программу, которая непрерывно принимает целое число в качестве входных данных до тех пор, пока не будет введена строка.Я написал тот же код на C #, но это приводит меня к ошибке.

Ваши коды C ++ и C # не эквивалентны.

Ваш код C # читает всю строку как есть,отбрасывает разрыв строки, а затем пытается преобразовать всю строку как есть в целое число.

Ваш код C ++ отбрасывает начальные пробелы - включая разрывы строк - до тех пор, пока не встретит непробельный символ, затем попытаетсяпрочитайте значение типа int, и все, что следует после него, включая разрыв строки, останется в потоке для последующих операций чтения.

Поэтому я должен использовать метод tryparse в C #.

Если вы не хотите, чтобы неудачное преобразование выдало исключение, тогда да.

0 голосов
/ 07 апреля 2019

C ++ знает, что нужно анализировать целое число, потому что вы определили переменную "value" как тип int.

Из ссылки на C ++:

Как объект класса istream, символы могут быть получены как отформатировать данные с помощью оператора извлечения (оператор >>) или как неформатированные данные, используя функции-члены, такие как чтение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...