2009-11-29 1 views
2

В текстовых книгах указано, что оператор & (addressof) не применяется к не может применяться к выражениям,
константы или переменные регистра.
Существуют ли константы только литералы типа «A», «7» и т. Д. Или переменные, объявленные с ключевым словом const?
Я думаю, что это означает только литералы, так как следующий код компилируется: -Использование & (addressof) с константными переменными в C

int main() 
{ 
const int i=10; 
const int *ip; 

ip = &i; 

}

ответ

0

&operator могут быть применены ко всему, что имеет память address.You не может применить & на регистровые переменные, как они хранятся на Регистры CPU.
Также в C константы не являются константами времени компиляции (т. Е. Всегда выделенным хранилищем), поэтому вы можете безопасно принимать адрес постоянной переменной. Но в C++, если вы берете адрес переменной const, это не будет постоянной времени компиляции и будет выделено хранилище.
Edit
константами я имею в виду, переменные, объявленные с const ключевые слова, литералы, как A, 7, по существу, время компиляции constants.compiler можно непосредственно хранить их в таблице символов.

+0

Следует отметить, однако, что в C++ (в отличие от C) допускается использование адреса переменной с классом хранения 'register' (даже если это не имеет большого смысла). –

+0

& оператор может применяться ко всему, что имеет адрес памяти. Конечно, литералы, такие как «A» 7, хранятся где-то в памяти (время выполнения), правильно? Конечно, я чего-то не хватает :) – Ankur

+0

Простые литералы, подобные этим, закодированы в инструкции, как непосредственные операнды. –

3

Нет - он может применяться к переменной, которая соответствует const. Обратите внимание, однако, что выполнение этого (в общем случае) означает, что компилятор должен фактически присвоить эту переменную адрес - если вы используете его только способами, которым не нужен адрес, переменная const часто не требуется назначать любое хранилище вообще (т. е. код, сгенерированный с использованием переменной const, часто будет почти таким же, как если бы вы использовали литерал напрямую, но вместо этого исходный код будет использовать значащее имя).

+1

В языках C const объекты имеют внешнюю связь по умолчанию (в отличие от C++, где они имеют внутреннюю связь). Обычно это означает, что компилятор C должен выделять хранилище для объектов 'const', независимо от того, как вы его используете. Только глобально оптимизирующий компилятор может устранить эти объекты 'const'. – AnT

+0

Конечно, в случае локальных объектов 'const', как в примере OP, компилятору проще их устранить. – AnT

+1

Не совсем верно сказать, что оно может быть применено к * любой * переменной - ему не разрешено использовать оператор '&' для переменных, объявленных с помощью классификатора 'register', или на битовом поле. – caf

3

Унарный оператор & в C может применяться к любому значению l. Объект, сконструированный с помощью константы, является значением lvalue, что означает, что к нему можно применить унарный &.

Термин «константа» в C действительно означает только литеральные константы, например 2. Объект, построенный по const, не является «константой» в терминологии C.

+0

Любое lvalue ", которое обозначает объект, который не является битовым полем и не объявлен с помощью спецификатора класса хранения' register', если быть точным. – caf