Что именно представляют собой определения, объявления и присваивания C ++?

StackOverflow https://stackoverflow.com/questions/671925

Вопрос

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

Это было полезно?

Решение

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

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

int x;

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

x = 0;

Здесь я делаю и то, и другое в одном заявлении:

int x = 0;

Примечание

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

T-SQL

declare x int;
set x = 0;

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

Питон

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 ++ a объявление переменной делает тип и имя переменной известными компилятору

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 и definition в одно целое, но вы должны сделать это до того, как функция будет вызвана в любом месте вашей программы.

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

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

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

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

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

int x;

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

extern int x;

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

x = 0;

Для Функции:

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

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

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

int functionDef(int x);

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top