Объявление переменных в C - PullRequest
0 голосов
/ 16 сентября 2010

Можем ли мы объявить переменную как во внутреннем, так и во внешнем блоке моей программы? Почему это называется плохой практикой, если программно это не создает никаких проблем ...

Ответы [ 5 ]

4 голосов
/ 16 сентября 2010

В C переменные имеют лексическую область видимости, что означает, что в любой заданной точке вашего кода компилятор знает, на какую фактическую переменную ссылается данное имя.Проблема в том, что если у вас есть две переменные с именем foo, (a) , вы можете не помнить, что есть что, и (b) вы не можете обращаться к внешнему foo когда вы находитесь во внутренней области действия foo.

В частности:

void MyFunction()
{
    int foo = 1;
    printf("%d", foo); // prints "1"

    // create a new scope...
    if (whatever)
    {
        int foo = 2;
        printf("%d", foo); // prints "2"
        foo = 3;
        printf("%d", foo); // prints "3"
    }

    printf("%d", foo); // prints "1"
}

Теперь просто представьте, что блок whatever был длинным и сложным ..когда вы доберетесь до foo = 3, допустим, что на экране нет верхней части блока, но вы знаете, что MyFunction имеет переменную всей функции с именем foo.Единственная проблема в том, что вы не правы, вы только устанавливаете значение "inner" foo.С точки зрения компилятора это очевидно ... потому что внутренний foo полностью скрывает внешний.Вот почему это считается плохой практикой.

Вы можете прочитать http://en.wikipedia.org/wiki/Scope_(programming), чтобы узнать больше о лексической области видимости.

3 голосов
/ 16 сентября 2010

Исходный код будет трудно понять, это проблема, но это законно.

2 голосов
/ 16 сентября 2010

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

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

2 голосов
/ 16 сентября 2010

потому что вы скрываете переменную в области видимости - и это хороший способ делать ошибкиВ небольших программах вы можете помнить, какая переменная является глобальной / локальной, в более сложных - нет.

1 голос
/ 16 сентября 2010

Это называется затенение переменных , оно имеет свои преимущества для небольших вещей, таких как конструкторы, но в долгосрочной перспективе это может привести к проблемам:

  • код неоднозначен и поэтому трудно читать и понимать
  • может быть непреднамеренно использована неправильная переменная, что приводит к трудностям в выявлении ошибок
  • может возникнуть путаница при работе с собственным кодом

Итог: да, вы можете сделать это, но избегайте этого как можно больше, особенно в больших проектах, так как вы, вероятно, в конечном итоге получите удар: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...