2013-07-03 6 views
1

У меня возникли проблемы с пониманием кода ниже. Он включает сеттер с оператором if, который требует, чтобы переменная начала была равна нулю (false) перед выполнением.Отрицательная логика оператора не имеет смысла

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

/**implementation file **/ 
-(void) setOrigin : (XYPoint *) pt 
{ 
    if (! origin) 
     origin = [[XYPoint alloc] init]; 

    origin.x = pt.x; 
    origin.y = pt.y; 
} 


/** Main file **/ 
myPoint.x = 2; 
myPoint.y = 3; 

shape1.origin= myPoint; 

myPoint.x = 2; 
myPoint.y = 3; 

shape1.origin= myPoint; 

} 

myRect.origin = myPoint;

^^ При первом появлении этого метода метод выполняется, поскольку переменная экземпляра равна нулю и (! Origin) действительна.

Однако, если я изменяю значения myPoint в следующей строке и снова устанавливаю myRect.origin = myPoint, метод setter не должен работать, потому что (! Origin) больше не является истинным, потому что он уже содержит ненулевое значение из предыдущего выполнения. Почему он все еще выполняется, несмотря на эту логику? Я ошибаюсь?

+0

Вы понимаете, что выражение 'if' влияет только на следующую строку, верно? – Kevin

+0

Эй, @kevin, я думаю, что я где-то читал, что отступы в объективе C имеют большое значение, если вы не используете скобки в своих операторах if/else. Поскольку origin.x = pt.x и origin.y = pt.y не имеют отступов в выражении if, не являются ли они частью инструкции if? – Brosef

+2

Нет, отступы не имеют абсолютно никакой разницы в объективе c. Эти два не являются частью оператора 'if', потому что' if' влияет только на следующий оператор и ничего больше. Период. (Скобки считаются одним утверждением, независимо от того, сколько внутри них). – Kevin

ответ

0

Этот оператор if проверяет, существует ли источник, и если источник не существует, он выделяет и инициализирует начало, прежде чем устанавливать значения в значения из аргумента метода.

В основном это удобный способ. В первый раз, когда вы его вызываете, источник создается при необходимости, а затем устанавливается в arg.

Если источник существует, он просто переходит к настройке.

2

Вы, кажется, путаетесь в области действия инструкции if. if влияет только на следующий оператор, независимо от пробелов. Например:

if(NO) 
    foo(); 
bar(); 

foo не называется, но bar есть; Я правильно отделил код, чтобы подчеркнуть это, но важно понимать, что отступы и даже новые строки не влияют на код. Я мог бы написать выше:

if(NO)foo();bar(); 

, и все будет точно так же. Именно по этой причине вы должны следить за пустыми заявлениями; следующая общая ошибка:

if(NO); 
    foo(); 
bar(); 

Вы обнаружили ошибку? Точка с запятой в конце if(NO); считается завершающей (пустой) операцией, на которую влияет if! Это означает, что foo() будет выполнен, несмотря на его вводящий в заблуждение отступ. Еще одна проблема, с которой я столкнулся, заключается в следующем:

if(NO) 
// foo(); 
bar(); 

Вы заметили это? bar(); является первым заявлением после if, поэтому его не называют!

Брекеты, независимо от их содержания, представляют собой единый (соединение) заявление, так:

if(NO) {} 
if(NO) { 
    foo(); 
} 
if(NO) { 
    foo(); 
    bar(); 
} 

Я не думаю, что есть какие-то сюрпризы здесь: все в фигурных скобках не выполняется, потому что фигурные скобки и все его содержимое - это одно утверждение.Использование брекетов предотвращает две ошибки, которые я упоминаю, и дает понять, что задумал программист. По этой причине я предлагаю всегда использовать фигурные скобки, чтобы четко указать, что вы хотите делать if.

В вашем конкретном случае:

if (! origin) 
    origin = [[XYPoint alloc] init]; 

origin.x = pt.x; 
origin.y = pt.y; 

можно переписать if с фигурными скобками, чтобы понять:

if (! origin) { 
    origin = [[XYPoint alloc] init]; 
} 

origin.x = pt.x; 
origin.y = pt.y; 

Это означает, что «если origin уже не объект, инициализировать его к new XYPoint.Если нет, не беспокойтесь, нам не нужно или хотите каждый раз создавать новый объект. Но независимо от того, нужно было создать объект или нет, установите его x и y Coordi

Смежные вопросы