Должен ли я использовать "int" или "bool" в качестве возвращаемого значения в С++?
Если у меня есть функция, которая выполняет некоторую процедуру, а затем нужно вернуть значение истинности чего-то, есть ли веская причина использовать либо логическую переменную, либо переменную int в качестве возвращаемого типа?
bool Foo()
{
...
...
return truthValue;
}
int Foo()
{
...
...
return truthValue;
}
Есть ли заметная разница между этими двумя функциями? Каковы некоторые возможные недостатки и преимущества для них обоих?
спасибо,
мр
Ответы
Ответ 1
Если это истинное значение истины, тогда вы должны использовать bool, так как он очень четко указывает вызывающему, что будет возвращено. При возврате int это можно рассматривать как значение типа code/enum.
Код должен быть максимально ясным и явным, будь то имена функций, имена и типы параметров, а также типы кодов возврата. Это обеспечивает более самодокументирующий код, код, который легче поддерживать, и более низкая вероятность того, что кто-то неправильно истолчит, что вы "имели в виду".
Ответ 2
Если вы хотите вернуть двоичное значение истины, тогда вы должны использовать тип данных boolean, где это возможно.
Составители будут оптимизировать вещи, если это необходимо, вы должны писать свой код как можно больше, чтобы быть ясным. Таким образом, вы или ваш преемник не сомневаетесь в течение пяти лет после того, что было запланировано.
Ответ 3
Используйте bool
- он более четко передает семантический смысл вашего кода. Если другой разработчик читает ваш код и видит тип возврата bool
, он сразу же понимает, что он возвращает значение истины. Если вместо этого он увидит, что он возвращает int
, ему нужно немного поработать и потратить больше времени на выяснение интерфейса функции (например, чтение документации или чтение кода), что замедляет его.
Единственная причина использования int
заключается в том, что вам нужно взаимодействовать с устаревшим кодом и/или соответствовать определенному интерфейсу (например, ваша функция получает свой адрес и передается в стороннюю библиотеку, которая ожидает функцию определенный прототип).
Ответ 4
Одна вещь, которая недостаточно подчеркнута в существующих ответах: используйте bool, но, чтобы получить максимальную пользу, вы просто должны использовать хорошие имена для своих переменных и функций bool. Я упоминаю об этом, потому что trueValue - типичное ужасное имя. Ваши имена bool всегда должны использовать соглашение, которое вы используете. Не заставляйте других кодировщиков угадывать, что происходит вокруг переменной bool. Таким образом,
Хорошие имена
bool okay;
bool error;
bool success;
bool IsWidget();
Плохие имена
bool truthValue;
bool status;
bool result;
bool Widget();
Вы видите разницу? По общему признанию, ваше правдоподобие, вероятно, лучше, чем статус или результат. Но в основном плохие имена приводят к запутыванию кода;
// Bad
bool result = Func();
if( result )
{
// Did Func() succeed or fail ? who knows
}
// Good
bool okay = Func();
if( okay )
{
// Func() succeeded
}
Ответ 5
Большим преимуществом использования bool является семантика. Если я вижу функцию, которая возвращает bool, я знаю, что она вернет true или false, даже не глядя слишком сильно или не задумываясь о названии функции. Если он возвращает int, мне приходится больше думать и смотреть ближе к функции.
Пока вы на нем (используя значение bool для возвращаемого значения), также называйте свои функции возврата bool таким образом, чтобы было очевидно, что истинное и ложное означают как возвращаемые значения. Подумайте об опасности: укажите свое имя функции в форме вопроса.
Ответ 6
Есть несколько соображений. Если Foo
предназначен для вызова с C, вы не можете вернуть bool
, потому что C не знает, что такое bool
.
int
также может возвращать значения, отличные от true
или false
. Это либо хорошая вещь, либо плохая вещь в зависимости от того, могут ли Foo
иметь другие значимые возвращаемые значения. Однако, если это возможно, для Foo может быть больше смысла возвращать значение enum
вместо int
.
Если у вас нет совместимости с C в качестве требования, я бы предложил bool
.
Ответ 7
bool раньше был просто макросом... теперь компиляторы заставляют его иметь только значения 0 или 1 (если только он не инициализирован). Я бы определенно использовал bool - он самодокументирован, и вам не нужно ничего, кроме bool. Держите его простым, конкретным.
Ответ 8
Если trueValue является bool return bool.
Это предотвращает обращение типа (не biggie).
Другая причина заключается в том, что принято возвращать int, чтобы сообщить статус, где 0 - успешное, а ненулевое число - условие ошибки. Таким образом, следующая информация будет неинтуитивной с точки зрения абонентов:
int process()
{
bool success = false
if (the process was successful)
success = trrue;
return success;
};
Обычно он должен быть либо
bool process()
{
bool success = false
if (the process was successful)
success = true;
return success;
}
так main:
int main()
{ return process() ? EXIT_SUCCESS : EXIT_FAILURE; }
или
int process()
{
int result = EXIT_FAILURE
if (the process was successful)
result = EXIT_SUCCESS
return result;
};
так main:
int main()
{ return process(); }
Ответ 9
Re: Ловушки. Проблема с int-as-bool заключается в том, когда люди это делали (вроде надуманного, но вы поняли):
typedef int BOOL
#define TRUE 1
#define FALSE 0
BOOL FDoSomething()
{
// code code code
return numTimesIDidSomething;
}
void Func()
{
// code code code
if(FDoSomething() == TRUE) // ERROR!
{
//etc
}
}
Какая ошибка, если numTimesIDidSomething больше 1.
Это приводит к двум вещам:
- Требование использования странных конструктов, таких как!! boolVariable для "нормализации" всех ints-as-bools для TRUE
- Изобретение выделенного типа bool в С++
Просто используйте bool.
Ответ 10
Это действительно ужасно Boolsh **