【问题标题】:What does the exclamation point in if (!strcmp() ... do?if (!strcmp() ... 中的感叹号有什么作用?
【发布时间】:2020-01-15 23:00:02
【问题描述】:

谁能解释一下 if 语句中的感叹号是做什么的(即!strmcp)?

 string names[] = {"EMMA", "RODRIGO", "BRIAN", "DAVID"};

// Search for EMMA
for (int i = 0; i < 4; i++)
{
    if (!strcmp(names[i], "EMMA"))
    {
        printf("Found\n");
        return 0;
    }
}
printf("Not found\n");
return 1;

【问题讨论】:

  • 这能回答你的问题吗? Using boolean values in C
  • 这个帖子的答案应该对你有帮助:stackoverflow.com/questions/1598425/…
  • 如果返回 0,也就是 false,当 2 个字符串匹配时,也就是相同。这 !对那个假做一个逻辑非,得到真,并在字符串相同时输入 if。什么时候真正应该打印出来
  • 代码很好,但不清楚。最好是if (0 == strcmp(...
  • 相关信息请参见How do I check if a value matches a string。符号!strcmp(…) 等价于strcmp(…) == 0——但不太清楚,IMO。

标签: c operators


【解决方案1】:

对于 if 语句,如果表达式的计算结果为 0,则不执行 if 语句后面的代码块。任何其他值(正或负)都将导致执行代码块。函数 strcmp 使用 0 表示字符串相等,因为小于 0 用于与大于 0 不同。

所以在这段代码中,我们希望在字符串相等时执行printf("Found\n");。由于 strcmp 的结果为 0,我们需要取反该值,使其变为 1,这将导致执行该代码块。

【讨论】:

    【解决方案2】:

    strcmp() 如果字符串相同,则返回 0,因此如果在 if 子句中使用它来断言 true 语句,则需要将其取反。

    如果你的子句是if(0),则条件里面的代码不会被执行。

    对于补全,如果找到的第一个不同字符在第一个字符串中较低,则返回负数,例如:

    第一个参数字符串:“abca”

    第二个参数字符串:abcd"

    这将返回负数。如果反过来,它将返回正值。

    另外,string 在 C 语言中通常不使用(我请您参考 Jonathan Leffler 的评论),您可以使用 char*

    char *names[] = {"EMMA", "RODRIGO", "BRIAN", "DAVID"};
    

    【讨论】:

    • 这没有回答问题
    • 您会发现 string 在 CS50 课程中使用(SO 标签 cs50;SE 网站 CS50)——作为 char * 的同义词(typedef)。我不相信这是一个好的选择,但这肯定是一个使用它的地方。
    • @JonathanLeffler,没听说过,我一定会把它添加到我的答案中。
    【解决方案3】:

    一元运算符! 称为逻辑非运算符(例如,参见cppreference.com 上的this 定义)。如果expression 计算结果为0,则! expression 返回1,如果expression 计算结果为除0 之外的任何其他值,则返回0

    所以if (!0) 中的条件给出1;这意味着,满足条件并进入 if 块。与if(0==0)同义

    由此而来的意义

    if(!strcmp(names[i], "EMMA"))
    

    在你的代码中是完全一样的

    if(0==strcmp(names[i], "EMMA"))
    

    你已经知道strcmp何时返回0...

    【讨论】:

      【解决方案4】:

      感叹号是 C 的布尔否定字符。 这意味着给我与值相反的 boolean。布尔值是 truefalse,在 C 语言中是 10

      在 C 中,if 语句在参数为真时执行它们的条件语句。

      if (a) 表示a 是否为真(即非零)
      if (!a) 表示a 是否为假(即0)

      因此:

      if (a)if (a != 0) 相同
      if (!a)if (a == 0) 相同

      有时你会看到在一行中使用两个感叹号的代码“!!

      例如:

      int a = !!b;
      

      这确保a 将仅是01,无论b 的值是什么。

      如果b 是任何非零值,! 运算符会将其视为真的true,它会将其视为与1 相同

      所以:

      !0 == 1
      !1 == 0
      !52 == 0
      !25692 == 0
      

      第二个! 再次进行布尔反转,所以:

      !!0 == 0
      !!1 == 1
      !!52 == 1
      !!25692 == 1
      

      【讨论】:

        【解决方案5】:

        C 中,任何非零值都被认为是逻辑真值,零被认为是逻辑假值。 ! 是逻辑否定。所以!0 (not false) 将是事实,if(!strcmp(str1,str2)) {statements} statements 将在str1str2 相同时执行

        【讨论】:

        • 无声DV-ter解释
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 2011-04-14
        相关资源
        最近更新 更多