Раньше я программировал на С#, но сейчас изучаю С++. Почему выход из цикла while в С++, когда я ввожу строку, а в С#, если я не использую tryparse, он выдает исключение. Делает ли С++ явно что-то вроде tryparse в бэкэнде? Извините, если мой вопрос Я использую кодовые блоки в качестве своей С++ IDE.
Я читаю книгу C++ primes и кодирую простую программу, которая непрерывно принимает целое число в качестве входных данных, пока не будет введена строка. Я написал тот же код на С#, но это приводит к ошибке. Поэтому я должен использовать метод tryparse в С#.
int value = 0;
В С++
while( cin >> value );
В С#
while( value == int.parse(Console.ReadLine());
C++ умеет анализировать целое число, потому что вы определили переменную «значение» как тип int.
Из ссылки на С++:
As an object of class istream, characters can be retrieved either as formatted data using the extraction operator (operator>>) or as unformatted data, using member functions such as read.
Я знаю, что также могу добиться такого же поведения с помощью tryparse, но я хочу знать, как С++ знает, что это не целое число, и без исключения он обрабатывает символ.
@RivenCallahan Простите, я прочитал вопрос наоборот. C++ умеет анализировать целое число, потому что вы определили переменную «значение» как тип int.
означает, что С++ может обрабатывать эти исключения формата в С# без какого-либо явного кода?
@RivenCallahan Да, операция извлечения потока имеет обработку исключений, см. cplusplus.com/reference/istream/istream/оператор%3E%3E
Why the while loop exit in c++ when I enter a string
operator>>
выполняет внутреннюю обработку ошибок. Если не удается извлечь целое число, поток входит в состояние сбоя, и цикл проверяет состояние потока, поэтому он завершается, когда поток терпит неудачу.
in c# if I don't use tryparse it will give an exception.
Да, потому что именно так работает int.parse()
.
Вы можете получить подобное поведение в C++ с помощью включение исключений в потоке . Таким образом, если происходит сбой извлечения, генерируется исключение std::ios_base::failure
.
Does the c++ explicitly do something like tryparse in the backend ?
В некотором смысле, да.
I am reading the book c++ primes and code a simple program that continuously takes integer as input until a string is entered. I wrote the same code in c# but it leads me to an error.
Ваши коды С++ и С# не эквивалентны.
Ваш код C# считывает всю строку как есть, отбрасывая разрыв строки, а затем пытается преобразовать всю строку как есть в целое число.
Ваш код C++ отбрасывает начальные пробелы, включая разрывы строк, до тех пор, пока не встретит символ, не являющийся пробелом, затем он пытается прочитать значение int, а все, что следует после него, включая разрыв строки, остается в потоке для последующего чтения.
So I have to use tryparse method in C#.
Если вы не хотите, чтобы неудачное преобразование вызывало исключение, тогда да.
@Caleth Я добавил, что
Возможный дубликат stackoverflow.com/questions/28623658/cin-integer-and-while-loop