Использование '&&' и '||'в заявлении вне условия в C - PullRequest
1 голос
/ 02 мая 2019

Я работаю над домашним заданием в C, мне дали уже готовую программу для его отладки, и я прошелся по этой строке кода

int main() {
FILE *personFile;

//...
//some code
//..

personFile && fclose(personFile);     //??
return 0;
}

Вместо

if (personFile != NULL) 
    fclose(personFile);

Я думаю, что fclose(personFile) никогда не происходит, если personFile равно NULL, поскольку C быстро оценивает "условия" и пропускает второй аргумент в &&, если первый равен false, но я не уверен

Это действительно так работает? И является ли этот способ «обмана» плохой практикой или мне просто повезло, что я никогда не видел ничего подобного?

Ответы [ 2 ]

4 голосов
/ 02 мая 2019

Так как оператор && использует оценку короткого замыкания (если левый операнд имеет значение false / 0, выражение не может быть истинным, поэтому не беспокойтесь о вычислении правого операнда), это простопроверка, что указатель файла не является NULL перед вызовом fclose для него.

Оператор || также использует оценку короткого замыкания, где, если левый операнд оценивается как ненулевой, весьвыражение определенно верно независимо от того, что является правильным операндом, поэтому оно не оценивается.

Это действительно так, как оно работает?И является ли этот способ «обманывать» условия плохой практикой, или мне просто повезло, что я никогда не видел ничего подобного?t поднимать брови во время проверки кода;Насколько мне известно, этот не один из них.

1 голос
/ 02 мая 2019

Это действительно так работает?

Да

А этот способ "обмана" - плохая практика, или мне просто повезло, что я никогда не видел ничего подобного?

Использование логических или условных операторов для управления потоком программ вместо управляющей структуры не является хорошей практикой, нет. Это не то, для чего эти операторы. IOW, написание

some_condition && some_action();

в качестве замены

if ( some_condition )
  some_action();

не является хорошей практикой.

Однако, если вы хотите вычислить логическое выражение и присвоить результат где-либо, даже если одно из условий является вызовом функции, тогда все в порядке:

result = some_value && some_function();

IOW, мы вычисляем значение с использованием оператора &&, не контролируя поток программы (даже если && влияет на то, будет ли вызван some_function()).

То же самое относится к оператору ?:. Запись

some_condition ? some_action() : some_other_action();

в качестве замены

if ( some_condition )
  some_action();
else
  some_other_action();

это плохая практика. Тем не менее,

result = some_condition ? some_function() : some_other_function();

нормально, потому что мы не используем его для управления потоком программ, мы используем его для вычисления значения.

...