Ответ 1
Нет, нет никакой разницы, кроме стиля кодирования. Я думаю, что основным аргументом в отношении стиля кодирования является то, что это объявление:
int& a, b;
объявляет a
как int&
и b
как int
.
Этот код:
int a = 5;
int& b = a;
b = 7;
cout << a;
печатает 7, а замена int& b
на int &b
также выводит 7.
На самом деле так и int&b
и int & b
.
Я тестировал такое поведение и с простым классом. В общем, действительно ли имеет значение, помещен ли амперсанд относительно типа и идентификатора? Спасибо.
Нет, нет никакой разницы, кроме стиля кодирования. Я думаю, что основным аргументом в отношении стиля кодирования является то, что это объявление:
int& a, b;
объявляет a
как int&
и b
как int
.
В C-подобных языках пробелы в основном не имеют значения.
Все версии, которые вы указали, анализируются как те же три токена:
int
&
b
поэтому они означают то же самое с компилятором.
Единственное время пробелов имеет значение, когда оно отделяет два буквенно-цифровых маркера, и даже тогда количество и тип пробелов не имеют значения, если они есть. Но любой знак пунктуации всегда становится отдельным символом из буквенно-цифровых символов, без пробелов.
Таким образом, ваш код может стать таким же коротким, как:
using namespace std;int a=5;int&b=a;b=7;cout<<a;
Остальные пробелы необходимы.
В общем, действительно ли имеет значение, помещен ли амперсанд относительно типа и идентификатора?
Приведенный пример не имеет значения, но есть случаи, когда он делает:
int & a, b; // b is not a ref
int const * a; // pointer to const int
int * const a; // const pointer to int
Как всегда, пробелы не имеют значения.
Это не имеет никакого значения для компилятора, каким образом он написан. Правильно это вопрос стиля кода.
Это не имеет никакого значения, потому что c/С++/java эти языки не чувствительны к пространству.
Это два функционально эквивалентных объявления:
int& a; // & associated with type
int &a; // & associated with variable
Связывание &
или *
с именем типа отражает желание программиста иметь отдельный тип указателя. Однако трудность сопоставления &
или *
с именем типа, а не с переменной состоит в том, что в соответствии с формальным синтаксисом C++
ни &
, ни *
не являются дистрибутивными по списку переменные. Таким образом, легко создавать вводящие в заблуждение объявления. Например, следующее объявление создает одну, а не две целые ссылки.
int& a, b;
Здесь b
объявляется как целое число (не целочисленная ссылка), поскольку при использовании в объявлении &
(или *
) привязывается к отдельной переменной
что он предшествует, а не тому типу, который он следует. Проблема с этим объявлением заключается в том, что визуально как a, так и b кажутся ссылочными типами, хотя только a
является ссылкой, поэтому визуальная путаница не только вводит в заблуждение новичков C++
программистов, но и иногда опытных программистов.
Неважно, пишите ли вы int &a
или int& a
для компилятора C++
. Однако, чтобы избежать путаницы, &
и *
должны быть связаны с переменной, а не с типом.