Декларация не считается действительной

0

Почему это плохо?

if (true)
    int stuff = 10;
else
    int stuff = 5;

printf("Stuff is %d\n",stuff);

Это из-за масштаба?

  • 0
    Как насчет (в контексте C, где true - это переменная): int stuff = true? 10: 5;
  • 4
    Как насчет: int stuff = 10;
Показать ещё 1 комментарий
Теги:
scope

3 ответа

7
Лучший ответ

Ваш вопрос помечен как C, так и C++. Ответ различен на двух языках.

В C и C++ обе ветки оператора if должны быть операторами:

if ( выражение ) инструкция else

где утверждение обычно представляет собой составной оператор/блок.

В C объявление не является инструкцией, поэтому ваш код является просто синтаксической ошибкой. Кроме того, слово true не отображается, если у вас нет #include <stdbool.h>. (В этом случае printf не отображается, если у вас нет #include <stdio.h>, но поскольку то, что вы разместили, является фрагментом более крупной программы, мы можем предположить это.)

Вы можете сделать оператор if/else действительным как в C, так и в C++, добавив фигурные скобки (что в целом является хорошей практикой):

if (true) {
    int stuff = 10;
}
else {
    int stuff = 5;
}

Теперь становится немного яснее, что вы объявили две различные переменные, как названный stuff. Объем каждого из них заканчивается в конце ближайшего закрывающего блока; в этом случае, что непосредственно следующее }:

if (true) {
    int stuff = 10;   // stuff is visible here
}                     // and now stuff is no longer visible
else {
    int stuff = 5;    // the other stuff is visible here
}                     // and now is no longer visible

После окончания блока stuff не просто больше не виден. Он даже не существует, потому что он дошел до конца своей жизни. Это две разные вещи: scope - это область текста программы, а время жизни - это подмножество времени выполнения запущенной программы. stuff только для кода после его объявления и перед включением }. Во время выполнения stuff объекта существует только до тех пор, пока выполнение не завершит закрытие }.

Так что да, основная проблема - область. У вас есть две разные переменные, оба именованных stuff, и ни одна из них не видна вызову printf.

Чтобы исправить это, как уже сказали другие ответы, переместите объявление stuff так, чтобы оно было перед оператором if/else и назначалось ему, а не инициализировало его.

Существует несколько других способов структурирования кода, в зависимости от того, что вы пытаетесь сделать (что невозможно сказать из кода, который вы опубликовали).

9

Да. stuff существует только в области блоков if и else (где они представляют собой две разные переменные). Вы должны объявить его за пределами if-else для работы.

int stuff;

if (true)
    stuff = 10;
else
    stuff = 5;

printf("Stuff is %d\n",stuff);
2

Определите код следующим образом:

int stuff;
if (true)
    stuff = 10;
else
    stuff = 5;

printf("Stuff is %d\n",stuff);

Вы можете прочитать о c++ объем здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню