2016-12-05 3 views
1

Мне интересно узнать, существует ли разница между этими двумя блоками if в C++. Было бы очень полезно, если бы с ответом вы могли бы привести некоторую ссылку.Есть ли разница между if (intVar) и if (intVar! = 0)?

if (intVar!= 0) 
{ 
    //Do something 
} 

и

if (intVar) 
{ 
    //Do samething 
} 

Где intVar, может быть любым типом целой переменной с любым значением.

[EDIT] По теме "дублированный вопрос". Я не нашел никакого вопроса об этом, в котором участвует оператор if.

+4

Нет абсолютно никакой разницы. –

+0

Возможный дубликат в [Is C/C++ bool type всегда гарантированно будет 0 или 1, если typecast'ed для int?] (Http://stackoverflow.com/questions/4276207/is-cc-bool-type-always-guaranteed -to-be-0-or-1-when-typecasted-to-int) – Andrew

+1

Я прошу, чтобы все говорили, что «нет никакой разницы». Очевидно, есть разница. Первая версия длиннее второй на 5 символов. – SergeyA

ответ

6

Тип выражения, требуемого в условии if, имеет значение boolean. Выражение intVar!=0 уже булево, выражение intVar имеет тип int и требует неявного преобразования в логическое. Так как правила конверсии для int - bool - это то, что все ненулевые карты равны true и нулевые карты равны false, поэтому результирующая оценка выражения точно такая же.

Иногда запись полного intVar!=0 может добавить ясность (например, чтобы было ясно, что вы не оцениваете тип указателя для nullptr, а скорее целочисленный тип для нуля), тогда как в других случаях это не так - это действительно зависит в контексте.

Что касается запрошенных ссылок, я буду использовать standard. Раздела, относящиеся к конверсии [conv.bool]:

4,14 булевых преобразований

prvalue арифметики, незаданной перечисления, указатель, или указатель типа элемента может быть преобразован в prvalue типа BOOL. Нулевое значение, значение нулевого указателя или нулевой член Значение указателя преобразуется в значение false; любое другое значение преобразуется в истинного

+0

Я начинаю думать, что это может быть правильный ответ, но не могли бы вы привести ссылку? – Rama

+0

@ Рама Drafts стандарта доступны онлайн. Найдите «преобразование». – molbdnilo

4

В C++ (и многих других языках) нет никакой разницы, поскольку любое ненулевое значение является «truey», а нуль сам по себе «falsey».

5

Дополнительно к другу в ответ (и для удовольствия), я хотел бы сказать, что для intVar из определенного пользователя типа определения неявного оператора преобразования в int и другой bool, два выражения могут иметь различное поведение:

#include <iostream> 

class Celcius 
{ 
    int _value; 
public: 
    Celcius(int value) : _value(value) {} 
    operator int() { return _value; } 
    operator bool() { return _value > -273; } 
}; 

int main() 
{ 
    Celcius waterBoilingPoint(0); 

    if (waterBoilingPoint != 0) { // false 
     std::cout << "This is not Standard Conditions for Temperature and Pressure!\n"; 
    } 

    if (waterBoilingPoint) { // true 
     std::cout << "This is not 0K (pun intended).\n"; 
    } 
} 

Но это крайний случай, я бы не прыгнуть.

+2

Отличная точка. – SergeyA

+0

Ницца! Это самый интересный ответ на самый скучный вопрос :) – Venemo

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