Есть ли разница между int & a и int & a?

Этот код:

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

печатает 7, а замена int& b на int &b также выводит 7.

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

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

Ответ 1

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

int& a, b;

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

Ответ 2

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

Все версии, которые вы указали, анализируются как те же три токена:

  • int
  • &
  • b

поэтому они означают то же самое с компилятором.

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

int& a, b;

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

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