Эффективность - вызов функции в условном выражении - PullRequest
0 голосов
/ 15 августа 2011

Если у меня есть немного кода, похожего на это:

if(someInteger || somecomplexfunction() > 0) {
    // do something
}

Будет ли вызываться функция, если someInteger имеет значение true?

p.s. компиляция с GCC с -O2

1 Ответ

6 голосов
/ 15 августа 2011

Нет, не будет.Логические операторы в C замыкают накоротко, поэтому, если левая часть || истинна, правая часть не будет оцениваться (и, следовательно, функция не будет выполняться, и никакие побочные эффекты, которые она может иметь, не будут действовать).Аналогично с &&, если левая сторона оценивает false, правая сторона не будет оценена.

Это определено в стандарте C и происходит в любом совместимом со стандартами компиляторе независимо от параметров компиляции.

Хотя это иногда приводит к повышению производительности, компиляторы выбирают не оптимизацию, а укоренившуюся семантику C.

...