Что такое определения, объявления и назначения C++?

Я склонен использовать слова define, declare и assign взаимозаменяемо, но это, кажется, вызывает оскорбление для некоторых людей. Это оправданно? Должен ли я использовать только слово declare в первый раз, когда я назначаю переменной? Или дело не только в этом?

8 ответов


Define и declare похожи, но assign очень отличается.

здесь я объявляю (или определяю) переменную:

int x;

здесь я присваиваю значение этой переменной:

x = 0;

здесь я делаю оба в одном заявлении:

int x = 0;

Примечание

не все языки поддерживают объявление и назначение в одном заявлении:

T-SQL

declare x int;
set x = 0;

некоторые языки требуется назначить значение переменной после объявления. Это требование позволяет компилятору или интерпретатору языка вывести тип переменной:

Python

x = 0

определение - это то, где описывается значение или функция, т. е. компилятору или программисту точно говорят, что это такое, например

int foo()
{
  return 1;
}

int var; // or, e.g. int var = 5; but this is clearer.

объявление сообщает компилятору, или программист, что функция или переменная существует. например,

int foo();
extern int var;

задание-это когда переменная имеет свое значение, обычно с помощью оператора=. например,

a = b;
a = foo();

важно использовать правильную терминологию, иначе люди не будут знать, о чем вы говорите, или неправильно предположить, что вы не знаете, о чем вы говорите.


эти термины часто имеют точного значения в стандартах для различных языков. В этом случае их не следует смешивать.

в c, например:

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

  • дополнительно переменная объявил когда вы говорите, какой он есть, и это происходит только один раз для каждой области. Но вы можете!--7-->присвоить неоднократно значение. (Некоторые языки также различают инициализации (предоставление переменной значения во время объявления) и задание (изменение значения позже).)


различия могут казаться тонкими, но они важны. Не каждый язык делает те же различия, но в C++переменной делает тип и имя переменной известно компилятору

int i;

A переменной определение выделяет память и задает начальное значение для переменной.

i = 1;

вы можете объединить объявление и определение переменной в один оператор, как это обычно сделанный.

int x = 1;

объявление переменной внутри функции также отложит память для переменной, поэтому следующий код неявно определяет переменную a как часть его декларации.

int main()
{
    int a;
    return 0;
}

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

An задание происходит в любое время, когда вы изменяете значение переменной в вашей программе.

x = 2;
x++;
x += 4;

A объявление функции, подобно объявлению переменной, делает сигнатуру функции известной компилятору. Это позволяет вызывать функцию в исходном коде до ее определения без возникновения ошибки компилятора.

int doSomething(float x);

A определение функции указывает тип возвращаемого значения, имя, список параметров и инструкции для функции. Первые три из этих элементов должны соответствовать объявлению функции. Функция должна быть определена только один раз в данной программе.

int doSomething(float x)
{
    if( x < 0 )
    {
        x = -x;
    }
    return static_cast<int>(x);
}

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


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

  1. для переменных.
  2. для функции.

на переменная :

-- определение:
Для компилятора, чтобы зарезервировать память для переменной.

int x;

-- замедление:
To сообщает компилятору, что переменная определена в другом месте.

extern int x;

-- назначение:
To указывает компилятору поместить значение в переменную.

x = 0;

на функции :

-- определение:

    int functionDef(int x){
      int x;  
      ...  
      ...  
      ...  
      return x;  
    }

-- замедление:
Это всего лишь прототип функции.

    int functionDef(int x);

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

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


Это может зависеть от языка, как уже было сказано. Я думаю, это действительно зависит от того, используются ли слова для таких вещей, как классы. Для большинства типов данных, обсуждаемых здесь, этот вопрос может не иметь большого значения. В C++ (см. c++ - в чем разница между определением и объявлением?), класс или структура всегда имеют точно одно определение, но могут быть объявлены ноль или более раз. Класс не может быть объявлен без определения. Таким образом, "объявленный" может быть синоним слова "используется".

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