【问题标题】:If statement without condition无条件 if 语句
【发布时间】:2020-04-13 17:13:15
【问题描述】:

我想问一下C语言在以下方面的行为是什么:

int n = 0;
.
.
// n in this block may change value to something else but a (positive) number
.
.
if(n)
{
  // do something
}
.
.

那么当n 是整数时,if(n) 是什么意思?

【问题讨论】:

  • if(n) 等价于if (n != 0)
  • “无条件”是什么意思?那里有一个明显的条件......
  • 它在真假的基础上进行评估,因此如果 n 为 0,则为假,否则视为真
  • 还应该提到的是,除非n 是布尔类型,否则这是不好的样式。考虑char* str_ptrif(str_ptr)if(*str_ptr) 的情况,很容易滑到这里并造成错误。这样的代码不是自记录的,对于读者来说,if(str_ptr) 的意图是与 NULL 指针进行比较,或者如果它是一个意外错误,程序员打算与 nul 终止进行比较,这对读者来说并不明显。相反,明确一点总是更好。将 if 语句视为需要布尔参数的函数。 if(str_ptr != NULL)if(*str_ptr != '\0').

标签: c if-statement conditional-statements


【解决方案1】:

根据C11 标准文档,第 6.8.4 章,选择语句

if ( expression ) statement

选择语句根据控制表达式的值在一组语句中进行选择。

从第 6.8.4.1 章开始,if 声明

在这两种形式中,如果表达式比较不等于 0,则执行第一个子语句。

所以,基本上,在这里,if(n)

  • 如果if(n) 结果为TRUE(n 不等于0,包括+ve-ve 值),则执行下一条语句(块)
  • 如果if(n) 结果为 FALSE(n 等于 0),则跳过下一条语句(块)

【讨论】:

  • 吹毛求疵:评估的不是if(n),而是n
  • @alk 先生,更新了我的答案,请查看。
【解决方案2】:

在 C 语言中,布尔类型用整数表示,因此每个正数都被视为布尔值 true,只有整数 0 被视为布尔值 false。

【讨论】:

  • 对不起,我之前的删除评论是 dxxn 错误:阅读“也负数评估为“真”。对不起!:-} 简而言之:除了0 之外的所有内容都是真的.
  • C 语言的布尔类型(_Bool)实际上只保证大到足以存储 1 或 0(truefalse)。不要将其与 if 语句的工作方式混为一谈;自 C 具有布尔类型之前以来,它们的行为方式就是如此。
  • 实际上 C 标准将每个非零值定义为 true,在 sec.本标准第 4.14 条。因此,“每个正数”这句话并不完全正确。
【解决方案3】:

在 C 语言中,所有值为 0 的整数类型的计算结果为假,否则它们的计算结果为真。请注意,即使是负数也会计算为 true。

在您的情况下,如果 n 保持为 0,则 if 语句的主体将不会执行,因为表达式的计算结果为 false。如果 n 设置为 0 以外的值,则 if 语句体将执行。

【讨论】:

    【解决方案4】:

    您似乎误解了条件的含义。条件不一定包含比较器,例如==< 等。条件可以是任何表达式。现在,如果 if 表达式的计算结果为零值,则它被认为是错误的,并且 if 语句不会被计算。否则,它被认为是真的,并且 if 语句被评估。

    【讨论】:

      【解决方案5】:

      很难理解你想在这里问什么,但我会花我的 2 美分,你决定它是否有助于你理解 if 语句的工作方式。

      int uiStupidFunction(int num)
      {
          return num++;
      }
      
      int uiAnotherStupidFunction(int num)
      {
          return 0;
      }
      
      int main(void)
      {
          int n = 0;
      
          // n in this block may change value to something else but a (positive) number
          //suppose in this way
      
          n = uiStupidFunction(10);
      
          if(n)
          {
              printf("n = %d", n);  //prints 10
              //do something
          }
          n = uiAnotherStupidFunction(10);
      
          if(n)
          {
              printf("n = %d", n);  //prints?
              //do something
          }
          else
          {
              printf("\nHumpty Dumpty sat on a wall");  //
          }
      }
      

      【讨论】:

        【解决方案6】:

        只是想补充一点 if(i) 将与 if (!!i) 相同,检查它是否非零。 而 if (!i) 是检查零。由于 true 为 1,false 为 0,所以 !!(true) 返回 true, !!(false) 返回 false。因此,当整数可能存储错误代码并希望将其结果标准化为布尔值并且它很短时,它有时很有用,但我建议将其写出来以便清楚。 (ie; if (i != 0) 而不是 if (i))

        希望下面的内容有所帮助。

            int i1 = -50, i2 = 0, i3 = 50;
            if (i1) 
                printf("if(-50) passed\n");
            if (i2) 
                printf("if(0) passed\n");
            if (i3) 
                printf("if(50) passed\n");
            if (!!i1)
                printf("if(!!-50) passed\n");
            if (!!i2)
                printf("if(!!0) passed\n");
            if (!!i3)
                printf("if(!!50) passed\n");
            if (!!true)
                printf("if(!!true) passed\n");
            if (!!false)
                printf("if(!!false) passed\n");
        

        然后我们得到以下结果。

        OUTPUT:
        
        if(-50) passed
        if(50) passed
        if(!!-50) passed
        if(!!50) passed
        if(!!true) passed
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-28
          • 2010-09-07
          相关资源
          最近更新 更多