Почему цикл while завершается в c ++ при вводе строки
operator>>
выполняет внутреннюю обработку ошибок.Если ему не удается извлечь целое число, поток переходит в состояние сбоя, и цикл проверяет состояние потока, поэтому он завершается при сбое потока.
в c #, если я не использую tryparseэто выдаст исключение.
Да, потому что именно так int.parse()
определен для работы.
Подобное поведение в C ++ можно получить с помощью включение исключений в потоке .Таким образом, если происходит сбой извлечения, выдается исключение std::ios_base::failure
.
Делает ли c ++ явно что-то вроде tryparse в бэкэнде?
В некотором смысле, да.
Я читаю простые числа c ++ и пишу простую программу, которая непрерывно принимает целое число в качестве входных данных до тех пор, пока не будет введена строка.Я написал тот же код на C #, но это приводит меня к ошибке.
Ваши коды C ++ и C # не эквивалентны.
Ваш код C # читает всю строку как есть,отбрасывает разрыв строки, а затем пытается преобразовать всю строку как есть в целое число.
Ваш код C ++ отбрасывает начальные пробелы - включая разрывы строк - до тех пор, пока не встретит непробельный символ, затем попытаетсяпрочитайте значение типа int, и все, что следует после него, включая разрыв строки, останется в потоке для последующих операций чтения.
Поэтому я должен использовать метод tryparse в C #.
Если вы не хотите, чтобы неудачное преобразование выдало исключение, тогда да.