В Objective-C есть ли переменные int, которым не присвоено значение nil?

Если у меня есть это в моем файле .h:

int index;

И затем в файле .m у меня есть:

if (index == nil)

и я не присвоил значение index, это сработает?

EDIT
Думаю, nil используется только для объектов. Итак, каково состояние int, которому не присвоено значение?


person marty    schedule 25.06.2010    source источник


Ответы (4)


Для целых чисел нет такого понятия, как «ноль». Это значение объекта. Что касается того, какие переменные инициализируются по умолчанию:

  • Нестатические локальные переменные не инициализируются каким-либо определенным значением (на практике они обычно будут иметь любой битовый шаблон, который ранее был в памяти, которую они занимают)
  • Статические переменные инициализируются 0
  • Глобальные переменные инициализируются 0
  • Переменные экземпляра инициализируются 0

Обратите внимание, что первое правило выше также применяется к локальным переменным объекта. Они не будут инициализированы nil для вас. (Однако переменные экземпляра с объектными типами будут.)

person Chuck    schedule 25.06.2010

Переменная технически не определена (может иметь любое значение) до того, как вы присвоите ей значение. Скорее всего, он будет равен нулю. Кроме того, и nil, и NULL определены как ноль. Однако такое сравнение не рекомендуется. Вы должны использовать nil только при сравнении указателей (он не предназначен для использования с примитивами).

person Kevin Sylvestre    schedule 25.06.2010
comment
скорее всего, но не всегда. @Kevin прав, и вы всегда должны инициализировать переменные. Однако int, которые являются переменными для объектов, инициализируются в 0 при вызове [obj init]; - person Stephen Furlani; 25.06.2010

Значение целого числа, которое еще не было присвоено, зависит от его объявления — int со статической продолжительностью хранения равно нулю, если вы не присваиваете ему ничего другого. int с автоматической или выделенной продолжительностью хранения может иметь любое значение, если вы не инициализируете его явно.

Между прочим, размещение объявления объекта в вашем заголовке, как это, обязательно причинит вам боль позже.

person Carl Norum    schedule 25.06.2010

nil — это специальное значение, зарезервированное для указателей объектов Objective-C. Он очень похож на NULL (0), но имеет другую семантику при передаче сообщений.

локальные примитивные типы данных, такие как int, не инициализируются в Objective-C. Значение индекса не будет определено, пока вы не напишете в него.

void foo () {
   //initialize local variable
   int x = 5;
}

//initialise static variable
static int var = 6; 
person Akusete    schedule 25.06.2010
comment
Они инициализируются до 0, если у них есть статическая продолжительность хранения, верно? - person Matthew Flaschen; 25.06.2010
comment
Я не думаю, что какие-либо примитивные типы инициализируются в C/Objective-C, вы должны всегда инициализировать примитивные переменные самостоятельно. - person Akusete; 25.06.2010
comment
Переменные со статической продолжительностью хранения определенно инициализируются нулем в C (C99 §6.7.8.10). - person Matthew Flaschen; 25.06.2010