Есть ли разница между int & a и int & a? - PullRequest
13 голосов
/ 30 декабря 2011

Этот код:

int a = 5;
int& b = a;
b = 7;
cout << a;

печатает 7, а замена int& b на int &b также печатает 7.

На самом деле так же int&b и int & b.

Я проверил этот тип поведения на простом классе.В общем, имеет ли значение, помещен ли амперсанд относительно типа и идентификатора?Спасибо.

Ответы [ 6 ]

17 голосов
/ 30 декабря 2011

Нет, нет никакой разницы, кроме стиля кодирования.Я думаю, что основной аргумент о стиле кодирования заключается в том, что это объявление:

int& a, b;

объявляет a как int& и b как int.

9 голосов
/ 30 декабря 2011

В языках, подобных C, пробел в основном не имеет значения.

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

  • int
  • &
  • b

, поэтому они имеют одинаковое значение для компилятора.

Единственный пробел времени имеет значение, когда он разделяет два алфавитно-цифровых токена,и даже тогда количество и тип пробелов не имеет значения, если они есть.Но любая пунктуация всегда становится отдельным токеном от буквенно-цифровых символов, пробелы не требуются.

Таким образом, ваш код может стать таким коротким, как:

using namespace std;int a=5;int&b=a;b=7;cout<<a;

Остальные пробелы необходимы.

6 голосов
/ 30 декабря 2011

В общем, имеет ли значение, помещен ли амперсанд относительно типа и идентификатора?

Приведенный пример не имеет значения, но бывают случаи, когда он имеет значение:

int & a, b;    // b is not a ref
int const * a; // pointer to const int
int * const a; // const pointer to int

Как всегда, пробел не имеет значения.

2 голосов
/ 18 апреля 2017

Это два функционально эквивалентных объявления:

int& a; // & associated with type
int &a; // & associated with variable

Связывание & или * с именем типа отражает желание программиста иметь отдельный тип указателя.Однако трудность связывания & или * с именем типа, а не с переменной, заключается в том, что, согласно формальному синтаксису C++, ни &, ни * не являются дистрибутивными по спискупеременные.Таким образом, легко создавать вводящие в заблуждение декларации.Например, следующее объявление создает одну, а не две целочисленные ссылки.

int& a, b;

Здесь b объявляется как целое число (не целочисленная ссылка), поскольку при использовании в объявлении & (или *) связан с отдельной переменной, которой он предшествует, а не с типом, которому он следует.Проблема с этим объявлением заключается в том, что визуально и a, и b кажутся ссылочными типами, даже если только a является ссылкой, поэтому визуальная путаница вводит в заблуждение не только начинающих C++ программистов, но иногда и опытных программистов.

Не имеет значения, пишете ли вы int &a или int& a для C++ компилятора.Однако во избежание путаницы & и * следует связывать с переменной, а не с типом.

1 голос
/ 09 июля 2016

Это не имеет никакого значения, потому что в c / c ++ / java эти языки не чувствительны к пробелам.

1 голос
/ 30 декабря 2011

Для компилятора не имеет значения, каким образом он написан. Что является правильным, это вопрос стиля кода.

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