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

时间:2019-05-31 15:11:06

标签: c if-statement operators expression

两者之间有什么区别

proc1.UseShellExecute = false;
string Command = @"Depanalyzer targets /n Dev\Tools\CleanupPerfCounters.exe";
proc1.FileName = @"C:\Users\xx\Desktop\MyCustom.cmd";
proc1.RedirectStandardOutput = true;
proc1.Verb = "runas";
proc1.Arguments ="/k " +  Command;
p.Start();
string output = p.StandardOutput.ReadToEnd();

1) !ret
2) ret != 0

3 个答案:

答案 0 :(得分:2)

它们是完全等效的。 (我认为您的意思是let obj: {'x': number} | undefined obj = Math.random() > 0.5 ? {x: 1} : undefined if (obj) { if (false as boolean) { // assertion widening obj['x'] += 1 // no error } } 而不是==,因为否则它们彼此对立且在任何方面都绝对不等价。)当将!=视为布尔值,如果要比较数量,则第二个。

但是,它们的对应对象并不相同。 ret很明显与ret不同,因为除0以外的任何值都被视为“ true”。这看起来似乎很麻烦,但是如果您将常规整数和ret != 1一起用作布尔值,则实际上可能会引起问题。

答案 1 :(得分:2)

在C中的布尔上下文中,零值被认为是“ false”,非零值被认为是“ true”。因此,Slider(如果if (ret)为真)等效于ret(如果if (ret != 0)不为假),并且与ret类似(如果if (!ret)不正确)等效于ret(如果if (ret == 0)为假)。

(即,假设问题正确,ret!ret的含义相反。)

答案 2 :(得分:1)

这两个表达式是不同的

1) !ret
2) ret != 0

_Bool 等于0 ret是非布尔的整数类型) >。

ret i 不等于0 时,第二个将产生1(即true)。

因此在此代码段中

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 ,则表达式{{1} }设置为*line