2013-03-04 7 views
1

Может кто-то пожалуйста, объясните, почему это не будет работать:Динамические глобальные переменные в C

int DIM = 128, hDIM = DIM/2 , dDIM = DIM*2; 

int main(int argc, char **argv){ 

    DIM *= 2; 

    printf("\n Double DIM is %d \n",dDIM); 

} 

Почему это печать 256 вместо 512?

+1

меняющегося 'DIM' не будет автоматически менять' dDIM', 'dDIM' имеет то же значение, вы инициализируетесь его, если не изменить его непосредственно (или через указатель или ссылка, но ни одна из них не применяется здесь) –

+0

Как я могу закодировать ее так, чтобы она динамически менялась? – Zizo47

+1

нет понятия в C++ переменных, автоматически обновляющихся на основе значений друг друга - по крайней мере, не встроенных в язык. если вы хотите обновить обе переменные, вам нужно обновить обе переменные самостоятельно. –

ответ

1

Как я могу закодировать его так, чтобы он динамически менялся?

Вы можете использовать функции вместо глобальных переменных:

int DIM = 128; 

int hDIM(void) { return DIM/2; } 

int dDIM(void) { return DIM * 2; } 

int main(int argc, char **argv){ 
    DIM *= 2; 
    printf("\n Double DIM is %d \n",dDIM()); 
} 

Таким образом, hDIM и dDIM оцениваются на основе текущего значения DIM каждый раз, когда вы используете их. Так как ваш код был, значения были присвоены hDIM и dDIM только один раз, в начале программы, используя значение, которое DIM имел в этой точке.

+1

Я сначала пробовал это во время отладки, но вторую ошибку в коде я думаю, что он не работает. благодаря – Zizo47

1

Это происходит потому, что вы только модифицировали значение DIM в основной функции(), тогда как dDim нетронутые после этого начальное значение 256(128 * 2) т.е..

int DIM = 128, hDIM = DIM/2 , dDIM = DIM*2; 

выше оператор устанавливает следующие значения:

DIM = 128 
hDIM = 64 
dDIM = 256 

В main(), когда вы делаете DIM *= 2, вы только изменить значение DIM. Остальные переменные не будут повторно оцениваться, так как вы не сделали никаких дальнейших присвоений hDIM или dDIM.

2

Поскольку dDim оценивается до выполнения main. В начале - до того main функция вызывается, DIM 128. dDim = 2 * DIM, что означает dDim 256.

Тогда main() функция вызывается, DIM устанавливается в 256. Но все это не имеет никакого влияния на dDim.

Как я могу закодировать его, чтобы он менялся динамически?

Вы можете использовать метод, упомянутый Caleb ниже, или вы можете использовать макросы препроцессора.

int DIM = 128; 

#define hDIM ((DIM)/2) 
#define dDIM ((DIM) * 2) 

int main() { 
    DIM *= 2; 
    printf("%d", dDIM); /*prints 512 :-)*/ 
    return 0; 
} 

Я, однако, не рекомендую вышеуказанный метод. Это отвратительно и сложно отлаживать. Например, он не этот тест:

assert_equal_float(2.5f, hDIM);/*when DIM is 5*/ 
Смежные вопросы