Почему точки с запятой в c ++ неявно обрабатывают ошибки? [TLDR: они не] - PullRequest
0 голосов
/ 29 октября 2019

Это выпуск Visual Studio 2019 для сообщества C ++ для Windows. У меня есть этот код ниже:

char c;
c = getc(stdin); // reading in some value
while(c != ';');
{
    // do something
}

Когда точка с запятой была в конце цикла while, она не давала исключение. Тот, который, казалось, сработал в цикле, где «сделать что-то». Когда я изменяю это на это:

char c;
c = getc(stdin); // reading in some value
while(c != ';')
{
    // do something -> exception thrown
}

Может кто-нибудь объяснить это мне? РЕДАКТИРОВАТЬ: Просто чтобы быть более конкретным. В части цикла «// сделать что-то» я менял значение c и т. Д., Я не думал, что это уместно, поэтому я не включил его.

Ответы [ 4 ]

3 голосов
/ 29 октября 2019

Этот оператор

while(c != ';');

может вызвать бесконечный цикл, если c не равно ';'. Тело цикла - пустой оператор ;. Таким образом, c не изменяется.

В этом операторе

while(c != ';')
{
    // do something -> exception thrown
}

тело цикла состоит из составного оператора

{
    // do something -> exception thrown
}

, в котором, например, c может быть изменено или может присутствовать оператор break.

3 голосов
/ 29 октября 2019

Код

while(c != ';');
{
    // Do something
}

эквивалентен

while(c != ';')
{
    // Empty body
}
{
    // Do something
}

Итак, сначала у вас (вероятно) бесконечный цикл, , а затем код "Сделай что-нибудь"в своей собственной вложенной области.

3 голосов
/ 29 октября 2019

Часть // do something в первом фрагменте - это , а не часть цикла while, ср. второй фрагмент, где он находится.

Этодостаточное изменение потока управления для изменения поведения вашей программы.

0 голосов
/ 29 октября 2019

Функция getc нуждается во входном потоке, например: getc (input_stream). Вы также можете использовать клавиатура или файл входной поток.

#include <stdio.h>
int main ()
{
  char c = ' ';
  while(c != ';') {
    c = getc(stdin);
    printf("%c", c);
    }
  return 0;
}
...