Выполнение функции в условии if

151
18 мая 2022, 19:50

Если я выполняю функцию в условии

if (function() == 0) {...}

она выполнится абсолютно также как и вне условия, это не влечет никаких побочных эффектов?

Чем такой вызов отличается от вызова вне условия?

Answer 1

Нет, это ни на что не влияет. Никакой разницы нет.

В соседнем ответе вспомнили про short-circuiting - свойство операторов && и || не вычислять второй операнд (и не вызывать в нем функции), и первого операнда достаточно для определения результата.

Но это происходит везде - и внутри условий if-ов, и снаружи.

Answer 2

Если функция выполняется, то она выполняется точно так же, как и вне условия.

Вся тонкость в "если выполняется" - в сложном выражении с операторами && и ||, для которых справедливо сокращенное вычислоение, она может не выполниться. Сокращенное вычисление - это если вычисляя условия, в некоторый момент становится очевидно значение полного условия, то остальные части не вычисляются. Например, в A && B, если вычисление A дает false, каким бы ни было B - результат будет false. В таком случае B не вычисляется.

Так что в

if (i == 0 && function() == 0) 

при i, не равном 0, function() вычисляться просто не будет.

Answer 3

Также скажу, что в С++ может быть код, в котором вызов функции не приводит к её выполнению. Например, если вызов функции - это аргумент decltype:

#include <iostream>
int func()
{
    std::cout << "Hello from func!" << std::endl;
    return 123;
}
int main()
{
    decltype(func()) var;
    return 0;
}

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

READ ALSO
Проблема с одновременной обработкой запросов 2х и/или более клиентов.(QTcpServer/QTcpSockets/C++)

Проблема с одновременной обработкой запросов 2х и/или более клиентов.(QTcpServer/QTcpSockets/C++)

у меня проблема с одновременной обработкой запросов 2х и/или более клиентовкогда подключаются 2 или более клиенты к моему серверу сервер...

163
Выбивает программу с ошибкой -1073741819

Выбивает программу с ошибкой -1073741819

В общем есть два класса, один для хранения, другой для добавления строк в базу данныхПолный код программы:

111
cUrl запрос с конкретного интерфейса

cUrl запрос с конкретного интерфейса

Имеется ОС Linux, libcurl 768

128
Профилирование gprof

Профилирование gprof

Помогите разобратьсяКуча мануалов по gprof - но они не понятные

145