Что такое C ++ определения, объявления и присваивания? - PullRequest
13 голосов
/ 23 марта 2009

Я склонен использовать слова «определять, объявлять и присваивать взаимозаменяемо», но это, кажется, обижает некоторых людей. Это оправдано? Должен ли я использовать слово объявлять только в первый раз, когда я назначаю переменную? Или есть что-то большее, чем это?

Ответы [ 8 ]

34 голосов
/ 23 марта 2009

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

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();
9 голосов
/ 23 марта 2009

Определить и объявить похожи, но назначить очень разные.

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

int x;

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

x = 0;

Здесь я делаю оба в одном утверждении:

int x = 0;

Примечание

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

T-SQL

declare x int;
set x = 0;

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

Python

x = 0
5 голосов
/ 23 марта 2009

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

4 голосов
/ 23 марта 2009

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

В c например:

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

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

2 голосов
/ 23 марта 2009

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

int i;

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

i = 1;

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

int x = 1;

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

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

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

Назначение происходит каждый раз, когда вы изменяете значение переменной в вашей программе.

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 голос
/ 17 сентября 2016

Общая роль: Определение = декларация + зарезервированное пространство.

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

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

Для Переменные :

- Определение:
Чтобы сказать компилятору зарезервировать память для переменной.

int x;

- Декларация:
Сказать компилятору, что переменная определена где-то еще.

extern int x;

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

x = 0;

Для Функции :

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

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

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

int functionDef(int x);
0 голосов
/ 10 февраля 2013

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

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

0 голосов
/ 23 марта 2009

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

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

...