Разница между (int ret = 0;! Ret && ret! = 0) - PullRequest
0 голосов

Какая разница между:

1) !ret
2) ret != 0

if (ret != 0 || stack[fd] == NULL || stack[fd][0] == '\0')
{
  if (!ret && *line)
    *line = NULL;
  return (ret);
}

Ответы [ 3 ]

2 голосов
/ 31 мая 2019

В логическом контексте в C нулевое значение считается «ложным», а ненулевое значение - «истинным». Следовательно, if (ret) (если ret истинно) эквивалентно if (ret != 0) (если ret не ложь), и аналогично if (!ret) (если ret не верно) эквивалентно if (ret == 0) (если ret ложно).

(т. Е. Значения !ret и ret != 0 противоположны, если предположить, что вопрос правильный.)

2 голосов
/ 31 мая 2019

Они в точности эквивалентны.(Я предполагаю, что вы имели в виду == вместо !=, потому что в противном случае они друг другу противоположны и определенно не эквивалентны.) Я бы порекомендовал первое, когда ret следует рассматривать как логическое значение, и второе, если выСравниваю количества.

Однако их аналог не эквивалентен.ret явно не то же самое, что ret != 1, так как любое значение, кроме 0, рассматривается как "истина".Это может показаться нобрейнером, но на самом деле это может вызвать проблемы, если вы используете обычные целые числа как логические значения вместе с #define true 1.

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

Эти два выражения различны

1) !ret
2) ret != 0

Первое выдает 1 (т. Е. True; в C нет логического типа. Тип _Bool является целым типом, а не логическим), когда ret равно 0 .

Второе дает 1 (т. Е. Истина), когда ret i s не равно 0 .

Такв этом фрагменте кода

if (ret != 0 || stack[fd] == NULL || stack[fd][0] == '\0')
{
  if (!ret && *line)
    *line = NULL;
  return (ret);
}

В первом условии

if (ret != 0 || stack[fd] == NULL || stack[fd][0] == '\0')

проверяется, не равен ли ret 0 (он может быть равен 0, но, тем не менее, оператор if)будет выполнен из-за других условий условия).Во втором условии

if (!ret && *line)

проверяется, равен ли ret 0.

Так во внутреннем операторе if

if (ret != 0 || stack[fd] == NULL || stack[fd][0] == '\0')
{
  if (!ret && *line)
    *line = NULL;
  return (ret);
}

, если переменнаяret равно 0 , а значение *line не равно 0 , тогда выражение *line установлено на NULL.

...