Оператор переключения C, ошибка переменной (для исходного кода программы калькулятора) - PullRequest
3 голосов
/ 08 июня 2011

Привет, сегодня, когда я пробую что-то новое (концепция и стиль, которые внезапно появляются в моей памяти), я столкнулся с несколькими проблемами, которые я не понимаю, почему это произошло.

Код

// This program would get two numbers from user , and request for an arithmetic operator , and carry out arithmetic.

 #include <stdio.h>


int main(void)
{
    int fNum;
    int sNum;
    int status = 1;
    int operator;
    int ans;

    printf("Enter the first operand :");
    while(scanf("%d" , &fNum) == 0)
        ;
    printf("Please enter the second operand :");

    while(scanf("%d" , &sNum) == 0)
        ;    
    printf("Which operator you wanted to use\n");
    printf("1 for +\n2 for -\n");


   while(status)
   {

     scanf("%d" , &operator);
     status = 0;

     switch(operator)
     {
           case 1:
             ans = fNum + sNum;
              break;

           case 2:
             ans = fNum - sNum;
             break;

           default:
             status = 1;
     }
   }

    printf("The answer is %d\n" , ans);

    return 0;
}

Мой анализ и вопрос

Первая часть:

1.) Есть одна вещь, которую я не понимаю, когдаЯ пытаюсь запустить этот код, я получаю предупреждающее сообщение от компилятора, "C: \ Users \ Znet \ Documents \ Pelles C Projects \ Test1 \ Test.c (10): предупреждение # 2229: Локальные 'ans'потенциально используется без инициализации. ", но, конечно, я все еще могу запустить программу, поскольку это не сообщение об ошибке.

2.) Мне просто интересно, почему это предупреждение появилось из любопытства,вместо того, чтобы просто объявить переменную ans, я инициализирую ее целочисленным значением (0 или любым целым числом), а предупреждающее сообщение просто исчезло. Что вызывает это? ?? Это потому, что переменная ans используется вswitch заявление, поэтому мы должны присвоить значениеперед его использованием? Потому что все время (когда я кодирую другую программу) я даже не инициализирую переменную значением перед тем, как использовать ее для хранения значения, вычисляемого арифметическим выражением.

Вторая часть:

1.) Проблема возникает внутри оператора switch, когда программа просит пользователя ввести либо число 1, либо 2 для арифметического знака.

2.) Если я введу целое число не в пределах 1 и 2, программа не продолжит работу, а вместо этого ждала, когда я вернусь к правильному значению, что является моим основным намерением.

3.) Но дело в том, что если значениеЯ ввожу не целое число, а символ, программа просто зависает, курсор все еще мигает, но он не реагирует на мой ввод с клавиатуры. В конце я должен убить программу, чтобы закрыть ее.

4.) Я знаю, что у меня есть много способов кодировать такую ​​программу, но мне просто интересно, почему в этом коде такая ситуация произошла ??

Спасибо, что прочитали мою проблему, надеемся получить от вас объяснения и знания, ребята:)

Ответы [ 3 ]

2 голосов
/ 08 июня 2011

Первый вопрос:

Компилятор обнаруживает, что ans только получает значение, назначенное ему условно (для двух конкретных случаев в вашем операторе switch).Некоторые компиляторы предупреждают об этом, а другие нет.Как правило, рекомендуется инициализировать любую переменную, которую вы создаете.

Второй вопрос:

На этот вопрос уже много раз отвечали - см. бесконечный цикл scanf .Проблема в том, что scanf принимает в этом случае только целое число.Как упомянуто в этой ссылке: «Любой символ, который не соответствует строке формата, заставляет его прекратить сканирование и оставляет недопустимый символ в буфере».Это приводит к тому, что ваш цикл while никогда не завершается.Если вы заинтересованы в более подробной информации, ссылка, упомянутая здесь, должна действительно помочь вам.

0 голосов
/ 08 июня 2011

Первая часть

Компиляторы могут выдавать предупреждение при использовании переменной без ее явной инициализации.Это потому, что неинициализированные переменные могут создавать неприятные ошибки в вашем коде.Например, рассмотрим следующий сегмент кода.

int main()
{
   /* NOTE: 'f' is uninitialized */
   int f, n;

   printf ("\nn : ");
   scanf ("%d", &n);

   while (n)
    f = f * n--;

   printf ("\nfactorial = %d", f);
   return 0;
}

В вышеприведенном коде выходные данные программы не определены.f является локальной переменной (automatic), поэтому, когда main начинает выполняться, f может иметь любое значение, например, мусор, а факториальное вычисление основывается на начальном значении f.Так что в таком случае неинициализированная переменная приведет вас к катастрофе.Для ее решения вам нужно сделать int f = 1; и вы получите правильный вывод.Это не ошибка, но может быть логической ошибкой, поэтому вам помогут компиляторы, чтобы случайно не оставить переменную неинициализированной.В вашем случае его инициализация не требуется, поэтому вы можете просто ans = 0; остановить предупреждение.

Вторая часть

Символ и целое число интерпретируются по-разному.Например, 12 - это два символа, и мы также можем сказать, что это целое число.Чтобы ввести его как целое число, вы должны использовать "%d" и символы scanf ("%c%c",&var1, var2);, так как есть два символа.Когда вы вводите символ, когда строка формата "%d", он обнаружит, что ввод не является целым числом (это символ), и остановится в этот момент и вернется.Ничто не будет сохранено в переменной operator.scanf возвращает количество прочитанных компонентов.В этом случае, когда он обнаружит, что вы ввели символ, он вернет 0, поскольку он не прочитал на входе и остановился.Но когда вы введете целое число, оно будет правильно считано в operator и вернет 1.Так что держите чек вроде:

/* Ask for input while the user does not input a 
 * valid integer.
 */
while (scanf ("%d", &operator) != 1)
{
   /* Body is entered whenever an invalid integer is entered */
   /* Your message */
}
/* When the user inputs a valid integer the condition 
 * in 'while' loop is false and program continues 
 */
0 голосов
/ 08 июня 2011
    • Q: «предупреждение # 2229: локальные« ans »могут использоваться без инициализации».

    • A: Это означаетчто ans может содержать любое значение при объявлении (так как переменные стека не обнуляются при объявлении) - и так как компилятор не видит программную логику, которая гарантирует, что переменная установлена ​​при печати - он выдает это предупреждение.Выполнение int ans = 0; удалит его.

    • Q: Если введенное мной значение не является целым числом, а вместо символа, программапросто завис бы, курсор все еще мигает, но он не реагирует на мой ввод с клавиатуры. В конце я должен убить программу, чтобы закрыть ее.

    • A

.

do { 
    printf("Which operator you wanted to use\n");
    printf("1 for +\n2 for -\n");
} while ( scanf("%d", &operator) != 1 );

scanf возвращает количество совпадений - если оно не совпадает с целым числом, оно возвращает 0.Следовательно;Проверьте возвращаемое значение.

...