Программирование на С - проблема - PullRequest
0 голосов
/ 17 июня 2011

Ниже приведен код C:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int a,b,d;
void Values1()
{
    a=a*2;
    b=b-5;
}

void Values2(register int c)
{
    d+=b-c;
    a=a+10;
    b*=3;
}
int a,b;

int main()
{
    int i=7;
    Values2(i);
    Values1();
    printf("a=%d, b=%d, d=%d\n",a,b,d);
    system("pause");
}

. Это дает ошибку компиляции, связанную с переопределением 'a' и 'b' в MS Visual C ++ 2010. Пожалуйста, помогите мне выяснить, почему эта ошибка имеетпроизошло.

Ответы [ 4 ]

4 голосов
/ 17 июня 2011

Вы определяете a и b в глобальной области видимости здесь:

int a,b,d;

и здесь

int a,b;

Вы не можете определять переменные дважды.

3 голосов
/ 17 июня 2011

Ваш компилятор плохо настроен. Ваша программа легальна C .

Повторные объявления a и b попадают в категорию "tentative definition".Правильно настроенный компилятор C не может остановить компиляцию из-за этого.

3 голосов
/ 17 июня 2011

Почему у вас есть эти две строки?

int a,b,d;
int a,b;

Вам нужно только один раз определить переменные . Я бы предложил избавиться от второйline.


Некоторые другие вещи, которые вы можете захотите рассмотреть в интересах развития своих навыков.

  • Глобальные переменные обычно считают плохим,Существуют более эффективные способы сделать это, которые намного лучше инкапсулируют информацию и уменьшат вероятность возникновения проблем в будущем.
  • Используйте значимые имена переменных.Они только замедляют работу компилятора и не влияют на вашу скорость выполнения, но они значительно упрощают поддержку вашего кода.
  • Мне нравится разбрасывать выражения, чтобы сделать их более читабельными, например d += b - c; вместо d+=b-c;.
  • Не беспокойтесь о ключевом слове register, это предложение для компилятора, и большинство современных компиляторов намного лучше, чем разработчики, выясняют, каклучше всего оптимизировать код.
  • Существует два канонических прототипа для main, и int main() не является одним из них - используйте int main (void), если вам не нужны аргументы программы.
  • Onкомпиляторы до C99, вы должны вернуть 0 из main (C99 вернет 0 для вас, если вы достигнете закрывающей скобки main).
0 голосов
/ 17 июня 2011

Сразу после определения Values2() есть строка int a,b;, которая будет конфликтовать с int a,b,d; до Values1(), поэтому вы можете безопасно удалить строку int a,b;.

Кроме того,чтобы получить хорошие результаты, вы можете установить значения a, b и c в начале основной функции, чтобы получить согласованные результаты.

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