2014-11-05 3 views
-1

Я новичок в C++, и у меня есть вопрос о следующем ниже коде. Верно ли, что строка «if(p1.spouse || p2.spouse) return false» - это еще один способ: « if(p1.spouse!= NULL || p2.spouse!=NULL)return false»?C++ Указатель, связанный с NULL

struct Person  
{ 
    string name;  
    string bday;  
    int height;  
    Person* spouse;  
}; 

bool marry(Person&, Person&); 

int main() 
{ 
    Person john;  
    john.name = "John";  
    john.bday = "May 29, 1917";  
    john.height = 72;  
    john.spouse = NULL;  
    Person marilyn;  
    marilyn.name = "Marilyn";   
    marilyn.bday = "06/01/1926";  
    marilyn.height = 64;   
    marilyn.spouse = NULL;  
    marry(john, marilyn); 
    cout << "John is married to " << john.spouse->name << endl;  
} 

bool marry(Person& p1, Person& p2) 
{  
    if (p1.spouse || p2.spouse) return false;  
     p1.spouse = &p2;  
    p2.spouse = &p1; 
    return true; 
} 
+0

формате код пожалуйста –

+0

почему вы не запустить код несколько раз, и проанализировать, что происходит –

+5

@SamIam: это обоюдоострый совет! Хотя полезно видеть, что происходит, представьте, если вопрос: «верно ли, что неинициализированные локальные переменные автоматически устанавливаются на 0?». – rodrigo

ответ

3

Да, это правда. Любой указатель в булевом контексте вычисляет значение false, если он равен NULL и true, если он не равен NULL.

Многие считают, что это плохой стиль, и предпочитают делать явное сравнение != NULL.

Лично я нахожу его довольно элегантным: это означает существование объекта. В частности, с короткозамкнутым булево &&:

if (obj && ojb->whatever()) 
    ...; 
0

Да, вы правы. Любой указатель, если NULL, возвращает false, если используется в условном выражении.

1

Это правда, и это очень часто используется.

от: http://en.cppreference.com/w/cpp/language/implicit_cast

«нулевого значения (для интеграла с плавающей точкой, и незаданного перечисления) и нулевого указателя и нулевых значений указателя на член становится ложным Все остальные значения становятся истинными.».

вы можете найти много правил преобразования более неявные в этом URL

+0

Ой, не используйте эту функцию для плавающей запятой! O.o –

+0

@MooingDuck согласен, для плавающих точек всегда используйте epsilon if-s – marcinj

+0

@MooingDuck Если вы не знаете, что они точно такие, какими они должны быть. Которых они редко бывают. – Deduplicator

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