Эти два выражения различны
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
.