Точка объявления в C ++
1696 просмотра
3 ответа
Почему не выводится, 101
когда я назначил предыдущее x
новому x
?
int x = 101;
{
int x = x;
std::cout << x << std::endl;
}
Выход (мусор):
422634
Я думал, что вторая x
будет инициализирована, 101
но она не инициализирована.
Примечание: решение в этом случае состоит в том, int x = ::x
но вопрос в том, почему это происходит.
Ответы (3)
45 плюса
Точка декларации
Точка декларации для имени находится сразу после его полного декларатора и перед его инициализатором ... [Стандарт C ++ § 3.3.2 / 1]
Компилятор завершает объявление, когда он знает достаточно об объявителе.
Код выше равен приведенному ниже:
int x = 101;
{
int x;
x = x; <------------------// Self assignment, assigns an indeterminate value.
std::cout << x << std::endl;
}
Потому что объявление внутреннего x
завершено до =
(присваивания)
int x = x; <--// Now, we have the new `x` which hides the older one,
^ // so it assigns itself to itself
|
+---// Point of declaration,
// here compiler knows everything to declare `x`.
// then declares it.
С другой стороны, когда мы объявляем сложные объекты, точка объявления находится дальше. Итак, поведение другое.
Например, ниже код в порядке
const int i = 2;
{
int i[i];
^
|
+----// Point of declaration
// compiler has to reach to "]"
// therefore before declaring `i` as an array
// there is just one `i`, the `i` of `const int i=2`
}
В приведенном выше коде компилятор должен знать фактический размер массива, чтобы завершить объявление, поэтому точка объявления такова ]
. Поэтому i
в [i]
это внешнее , i
потому что декларация из i
из int i[...
еще не завершена. Таким образом, он объявляет массив с 2
элементами ( int i[2];
).
Также в этом примере показана точка объявления для перечислителя.
const int x = 12;
{
enum { x = x };
^
|
+---// Point of declaration
// compiler has to reach to "}" then
// there is just one `x`, the `x` of `const int x=12`
}
Перечислитель x
инициализируется значением константы x
, а именно 12
.
9 плюса
Есть еще один способ сделать это.
#include <iostream>
int x = 101;
int main()
{
int x = ::x;
std::cout << x << std::endl;
std::cin.get();
}
Автор: greego
Размещён: 01.04.2013 03:39
0 плюса
переменная область перед x будет перезаписана. int x = x; В этом есть два процесса. One: int x; (определить переменную x и выделить память и указать начальное значение: x = 0); в этот момент фронт х будет скрыт. Два: х = х; (не найти значение х);
Автор: chuang wang Размещён: 01.04.2013 04:29Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- c++ Что такое виртуальный базовый класс в C ++?
- c++ В чем разница между #include <filename> и #include "filename"?
- c++ Какой самый лучший бесплатный детектор утечки памяти для программы на C / C ++ и ее подключаемых библиотек DLL?
- c++ Как преобразовать std :: string в LPCWSTR в C ++ (Unicode)
- c++ Regular cast vs. static_cast vs. dynamic_cast
- c++ Синтаксические стили C ++
- c++ Как прочитать значение из реестра Windows
- c++ Какие компиляторы C ++, если таковые имеются, выполняют оптимизацию хвостовой рекурсии?
- c++ Каковы различия между «универсальными» типами в C ++ и Java?
- c++ Как добавить отражение в приложение C ++?
- c++ Как мне вызвать :: CreateProcess в C ++ для запуска исполняемого файла Windows?
- c++ Почему порядок, в котором связаны библиотеки, иногда вызывает ошибки в GCC?
- c++ Как вы обнаруживаете / избегаете утечки памяти в вашем (неуправляемом) коде?
- c++ Как вы устанавливаете, очищаете и переключаете один бит?
- c++ Вызов python из программы c ++ для распространения