【问题标题】:Single-line if statements in C - which statements are affected?C 中的单行 if 语句 - 哪些语句受到影响?
【发布时间】:2017-07-26 21:27:47
【问题描述】:

我正在尝试将一些代码从 C 语言翻译成另一种语言。我无法快速访问 C 编译器,只是发现自己对单行 if 语句感到困惑。我知道这样的陈述:

if (condition) [statement]

if (condition)
    [statement]

可以在没有括号的情况下进行评估,即等同于:

if (condition) {[statement]}

if (condition)
    {[statement]}

分别,但我不确定我正在处理的示例代码。它去:

if (ge.g[*l][*k].s==1) *i=1; else *i=Ne;  
*j=*l; 

我觉得第二行不受 if 语句的影响,但从代码的上下文中看并不是很明显。长话短说:以上是否等同于:

if (ge.g[*l][*k].s==1) {*i=1;} else {*i=Ne;}  
*j=*l; 

if (ge.g[*l][*k].s==1) {*i=1;} else {*i=Ne;  
*j=*l;} 

?

【问题讨论】:

  • 如果没有括号,只有第一个语句被认为是 if-else 块的一部分。所以它相当于你的第一个选项。
  • 为什么else 会吞下多个语句?顺便说一句,行数无关紧要。
  • “我无法快速访问 C 编译器”下载一个和一个调试器。无论如何,您都需要一个来进行测试/调试,现在获得这些工具将使您能够测试任何此类混淆。
  • .. 或者只是在在线编译器上尝试一下。
  • 如果使用if 语句,1) 不要省略括号,2) 不要将两个括号放在同一行。您不会通过存储这些额外的字符来破坏您的 SSD。但是,如果三元运算符可能使表达式更具可读性,例如:*i = (stuff==1) ? 1 : Ne,则可以节省一些输入。

标签: c if-statement conditional


【解决方案1】:

以下代码

if (ge.g[*l][*k].s==1) *i=1; else *i=Ne;  
*j=*l; 

当格​​式正确时是这样写的:

if (ge.g[*l][*k].s==1)
   *i=1;
 else
   *i=Ne;  

*j=*l; 

这是等效的代码带有大括号:

if (ge.g[*l][*k].s==1)
{
   *i=1;
}
else
{
   *i=Ne;  
}

*j=*l; 

这显示了正确格式化代码的重要性,因此人类也可以阅读和理解,而不仅仅是编译器。

【讨论】:

  • 它还展示了括号如何为您节省大量猜测工作。
【解决方案2】:

花括号实际上将许多语句组合为一个复合语句。

if 的语法如下:

if (condition) statement1 [else statement2]

其中[]表示:可选

现在statement1 可以是单个语句(由分号分隔)或所谓的复合语句,即用大括号括起来的一组后续语句。 statement2 也是如此。

这就是为什么您的第一个选择是正确的。如果也涉及第二行,则必须使用大括号,将语句组合成一个复合语句。由于没有“卷发”,第一种选择是正确的。

【讨论】:

    【解决方案3】:

    简化括号

    {}

    创建一个“复合”语句(我知道 C 学者看到这个“定义”会很不高兴)。在您的问题中,单个语句可以替换为复合语句(在大括号中)。语句的位置无关紧要,因为编译器会忽略大部分空格(字符串和预处理器处理的所有内容除外)。你甚至可以添加 100000 个换行符,它不会改变任何东西。它只对我们人类很重要:)

    if(x==y)start(x);else start(y);
    

    ===

    if (x == y)
        start(x);
    else 
        start(y);
    

    ===

    if      (x       ==                  y)
    
    
    
    
    
                                                                    start(              x          ); 
    
    
    
                                                                     else 
    
    
    
    
    start(                                           y)                        
    
    ;
    

    但第二个是最容易阅读恕我直言的 :)

    【讨论】:

      【解决方案4】:

      单语句(不带括号)。

      一个语句是一个以单句结尾的操作;签名

      if (condition)
          statement 1;
      

      示例:

       if (ge.g[*l][*k].s==1) 
           *i=1;  // statement 1
       else 
           *i=Ne; // statement 1
      
       *j=*l; // statement 2
      

      单个语句(带括号)。

      if (condition) {
          statement 1;
      }
      

      示例:

       if (ge.g[*l][*k].s==1)  {
           *i=1;  // statement 1
       }
       else {
           *i=Ne; // statement 1
       }
      
       *j=*l; // statement 2
      

      多条语句(带括号)

      方括号 {仅在您的陈述不止一个时才需要

      if (condition) {
          statement 1;
          statement 2;
          statement n;
      }
      

      示例:

       if (ge.g[*l][*k].s==1) {
           *i++; // statement 1
           *i++; // statement 2
           *i++; // statement 3
       }
      

      【讨论】:

        猜你喜欢
        • 2021-06-10
        • 2020-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 2021-06-17
        • 1970-01-01
        • 2012-05-18
        相关资源
        最近更新 更多