2016-10-01 2 views
0

Так что я булеву функцию:булева функция по сравнению с истинно/ложно

bool func(int x, int y){ 
     // do something 
    if (x==y){ 
     return true; 
     } 
} 

Когда я использую функции в случае цикла,

if (func(x, y)){ 
    // do something 
} 

это не то же самое, как

if (func(x, y) == true){ 
    // do something 
} 

В чем причина этого?

BTW: Я использую Visual Studio 2015.

Спасибо!

+0

Re: "В чем причина этого?" - по той же причине кто-то напишет 'if (((func (x, y) == true) == true)': они недостаточно хорошо знают язык, чтобы писать простой код. –

ответ

2

Операции if - это точно то же самое. Они логически эквивалентны друг другу.

Проблема в том, что ваш func не возвращает значение, если сравнение не выполняется.

Это приводит к неопределенному поведению.

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

Если ваш компилятор молчал, проверьте его документацию, как включить дополнительные предупреждения.

+4

Он даже не компилируется! – sergiol

+0

Если это C-код, компилятор C. будет –

+0

OP может рассмотреть возможность изменения 'if (x == y) {return true;}' для более простого и правильного 'return x == y;'. избегайте фактически набирать 'true' /' false' и просто позволяйте вашим тестам делать это за вас, я считаю, что обычно это делает лучший код. – ShadowRanger

2

Операторы if действительно то же самое, но проблема с вашим кодом в том, что если x не равно y, он ничего не может вернуть. И, честно говоря, этот код не должен компилироваться, поскольку VC++ должен понимать, что он ничего не вернет, если x не равен y, и эта функция не будет функционировать должным образом. Вы можете изменить свой код, чтобы это было более безопасно:

bool func(int x, int y){ 
     // do something 
    return x==y; 
} 

Это делает его так, что он не возвращает логическое значение, независимо от того, что. Если x равно y, верните true, иначе верните false. Опять же, это должно быть ошибкой с компилятором Visual Studio или вы не даете нам правильный код. FYI: Если это был компилятор g ++ или clang ++, этот код не был бы скомпилирован по причине, которую я объяснил.

Вы должны включить дополнительные предупреждения для своего компилятора VC++, используя -Wall (все предупреждения). Это должно помочь вам достичь этого: https://blogs.msdn.microsoft.com/vcblog/2010/12/14/off-by-default-compiler-warnings-in-visual-c/

Всегда убедитесь, что у вас есть -Wall включен, чтобы иметь «безопасный» код, а также убедитесь, что ваша функция будет вернуться, если что-нибудь случится, если только это не void/не возвращения функции. Обычно это делается компилятором вроде clang ++. Существует плагин для clang ++ и VA: http://llvm.org/builds/. Вы также можете искать clang в своем диспетчере подключаемых модулей Visual Studio для установки непосредственно из среды IDE.

+1

Обычно он компилируется, хотя и с предупреждениями. –

+0

См. Новый ответ @ShadowRanger – amanuel2

+0

Это не ошибка компилятора; неспособность вернуться из функции - это неопределенное поведение без необходимости диагностики –

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