Наступний код (взятий звідси ):
int* ptr = int();
компілюється у Visual C ++ та ініціалізує значення покажчика.
Як це можливо? Я маю на увазі int()призводить об’єкт типу, intі я не можу призначити intвказівник.
Як код вище не є незаконним?
Наступний код (взятий звідси ):
int* ptr = int();
компілюється у Visual C ++ та ініціалізує значення покажчика.
Як це можливо? Я маю на увазі int()призводить об’єкт типу, intі я не можу призначити intвказівник.
Як код вище не є незаконним?
int()виходить значення, побудоване значенням int(яке, я думаю, що вказана річ C ++ 03), і значенням за замовчуванням intє 0. Це еквівалентноint *ptr = 0;
NULLможе бути ненульове значення. Я сказав, що це може бути будь-яка ціла константа з нульовим значенням (що включає int()).
Відповіді:
int()є константним виразом зі значенням 0, тому це дійсний спосіб створення константи нульового покажчика. Зрештою, це лише дещо інший спосіб сказатиint *ptr = NULL;
nullptr, який ви можете використовувати замість 0або NULLв новому коді.
0може означати константу нульового покажчика або число 0, тоді nullptrяк очевидно, що константа нульового покажчика. Крім того, як сказав Джамін, він також має "додаткові перевірки часу компіляції". Спробуйте подумати, перш ніж друкувати.
Тому що int()дає врожайність 0, яка взаємозамінна з NULL. NULLсам по собі визначається як 0, на відміну від C, NULLякий є(void *) 0 .
Зверніть увагу, що це буде помилкою:
int* ptr = int(5);
і це все одно буде працювати:
int* ptr = int(0);
0є спеціальним постійним значенням і як таке воно може розглядатися як значення покажчика. Постійні вирази, що дають 0, такі як 1 - 1дозволені, як і константи нульового вказівника.
(void *)0. Це просто реалізація, визначена "цілочисельний константний вираз зі значенням 0, або такий вираз, що використовується для введення void *".
NULLяк (void*)0; це було завжди 0(а може, і 0L). (Але тоді, на той час, коли C90 зробив (void*)0легальний на C, я вже використовував C ++.)
#if !defined(__cplusplus) \n #define NULL ((void*)0) \n #else \n #define NULL (0)поточна версія gcc в ubuntu - 4,5, у нашій системі - 4,0.
0є спеціальним літералом" - лише тому, що це константний вираз, і воно має спеціальне значення 0. (1-1)однаково особливе, це також константа нульового покажчика, і так само int(). Факт 0буквеності є достатньою, але не необхідною умовою, щоб бути постійним виразом. Щось на зразок strlen(""), хоча воно також має особливе значення 0, не є постійним виразом і, отже, не є константою нульового покажчика.
0, а не про 0буквальне.
Вираз int()обчислюється як постійне ціле число, яке ініціюється за замовчуванням, яке є значенням 0. Це значення є особливим: воно використовується для ініціалізації вказівника на стан NULL.
int f() { return 0; }, вираз отримує f()значення 0, але його не можна використовувати для ініціалізації покажчика.
З n3290 (C ++ 03 використовує подібний текст), пункт 4.10, перетворення покажчиків [conv.ptr], параграф 1 (наголос зроблено на моєму):
1 Постійна нульового вказівника - це інтегральний константний вираз (5.19) першого значення цілого типу, яке обчислюється нулем, або першого значення типу std :: nullptr_t. Нульова константа вказівника може бути перетворена в тип вказівника; результатом є значення нульового покажчика цього типу, яке можна відрізнити від будь-якого іншого значення покажчика об’єкта або типу покажчика функції. Таке перетворення називається перетворенням нульового покажчика. [...]
int()є таким інтегральним константним виразом першого значення цілочисельного типу, яке обчислюється рівним нулю (це просто!), і, отже, може використовуватися для ініціалізації типу покажчика. Як бачите, 0це не єдиний інтегральний вираз, який має особливу форму.
Well int isn't an object.
I beleive what's happening here is you're telling the int* to point to some memory address determined by int()
so if int() creates 0, int* will point to memory address 0
int() most certainly is an object.
int(). Define int i;, then no question, i is an object.
intє типом, а не об'єктом. Будь int()дає об'єкт або просто Rvalue не впливає на що - небудь хто - небудь говорив в іншому місці.