(int ret = 0; !ret && ret !=0) 之间的差异

Difference between (int ret = 0; !ret && ret !=0)

有什么区别:

1) !ret
2) ret != 0

?

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

它们完全等价。 (我假设你的意思是 == 而不是 != 因为否则它们彼此相反并且绝对不等同。)当 ret 应该被视为一个时,我会推荐第一个如果要比较数量,则为布尔值和第二个。

然而,他们的对应物并不等同。 ret 显然与 ret != 1 不同,因为除 0 之外的任何值都被视为 "true"。这看起来似乎很简单,但如果您将常规整数作为布尔值与 #define true 1.

一起使用,它实际上会导致问题

这两个表达方式不同

1) !ret
2) ret != 0

ret 等于0.

ret is 不等于 0.

时,第二个产生 1(即真)

所以在这段代码中

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

第一个条件

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

检查ret是否不等于0(可以等于0但if语句仍然会因为其他sub-conditions条件而执行)。在第二种情况下

if (!ret && *line)

检查ret是否等于0。

所以在内部 if 语句中

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

如果变量ret等于0*line的值不等于0 然后表达式 *line 设置为 NULL.

在 C 语言的布尔上下文中,零值被视为 "false",non-zero 值被视为 "true"。因此 if (ret)(如果 ret 为真)等价于 if (ret != 0)(如果 ret 不为假),类似地 if (!ret)(如果 ret不正确)等同于 if (ret == 0)(如果 ret 为假)。

(即!retret != 0的意思相反,假设题目正确。)