【问题标题】:Where does this `else` statement end?这个 `else` 语句在哪里结束?
【发布时间】:2016-09-05 08:03:08
【问题描述】:

试图将这部分Delphi 代码转换为C#,但我对if/else 语句的以下else 部分实际结束的位置感到困惑。以下是代码的确切格式:

 try
   Root:=ExtractFileRoot(FileName);
   ErrorStr:=ExtractFileRoot(FileName)+' invalid name';
   if not GetNextNumericSegment(Root,Segment) then exit;  
   if length(Segment) = 4 then
   begin
      Year:=StrToInt(Segment);
      GetnextNumericSegment(Root,Segment)
   end
   else // Where does this else statement end?
       Year:=Defaultyear;
    ErrorStr:=ExtractFileRoot(FileName)+' invalid';
   if Length(Segment) <> 3 then exit;
   Jday:=StrToInt(Segment);
    ErrorStr:=ExtractFileRoot(FileName)+' Bad File';
   if not GetNextNumericSegment(Root,Segment) then exit;  // bad Time of day
   GetTimeFromFileName:=EncodeDate(Year,1,1)+Jday-1+
                        EncodeTime(StrToInt(Copy(Segment,1,2)),StrToInt(Copy(Segment,3,2)),StrToInt(Copy(Segment,5,2)),0);
 except
       GetTimeFromFileName:=0;
 end;

我知道您不必使用开始/结束,但到目前为止我在此代码中看到的所有内容都使用了它。我还读到您不需要在声明的if 部分中使用;,并且else 之后的第一个; 是else 的结尾。

我的猜测是else 和except 之前的所有内容都是else 语句的一部分。

注意:如果我可以实际调试,这将很容易,但不幸的是,我只是获得了 sn-ps 的代码和函数,以便在没有真实上下文的情况下进行转换。

【问题讨论】:

  • else 将在此语句之后结束:Year:=Defaultyear;
  • 谢谢!我能问这是为什么吗?是因为格式还是其他原因?
  • 尝试阅读该语言的文档。真的没有什么可以替代将带来的理解。
  • 也许this answer 会有所帮助。
  • @pfinferno - 如果您的代码格式与上述示例一样糟糕,我建议您使用代码格式化程序。旧版本的 Delphi 没有内置的,但有几个第三方免费的可用 - 请参阅 stackoverflow.com/questions/402737/delphi-code-formatter

标签: delphi if-statement delphi-7


【解决方案1】:

我发现无论有多少语句,始终使用 Begin/End 很有用。例如;

If A = 1 then
    Begin
      // Every line here executes if A = 1
      ShowMessage('A does in fact equal 1');
      ShowMessage('These messages can be annoying')
    end 
      else
    Being
      // Everything here executes if A doesn't equal 1
      ShowMessage('A was not equal to 1');
      ShowMessage('This is still an annoying message') 
    End;

【讨论】:

    【解决方案2】:

    除了上面提到的“阅读文档”之外,如果您需要一个可视化工具来帮助您跟踪 Delphi 7 中的 if/else 对和其他内容,我建议您安装 Castalia 工具。对你有很大的帮助。

    【讨论】:

      【解决方案3】:

      我建议阅读文档,If Statements。

      在else 之后是一个声明。每个语句(结构化或非结构化)都可以用分号分隔符 ; 结束。

      语句可以是compound。在这种情况下,它包含在 begin/end 构造中。

      在您的情况下,else 语句以 Year := DefaultYear; 结尾


      我建议始终使用“开始/结束”对,即使语句是单行。代码更具可读性,如果您稍后添加一行,错误就会更少。

      【讨论】:

      • FWIW,; 是分隔符而不是终止符。语句不一定必须跟;。
      • “始终使用‘开始/结束’对是一个很好的编码标准”谁说的?我认为这是基于意见/口味的。查看Delphi源代码。
      • @kobik,我看到了太多的错误和误解。我推荐使用 begin/end :-)
      • 我个人发现使用比必要更多的开始/结束对的代码更难阅读。如果语句可以简化为一个,我个人会省略它们。但我同意 kobik 的观点,即这是一种偏好。我理解总是使用 begin/end 很好的论点,以及为什么,但我认为它使代码比必要的冗长得多。
      • @kobik:查看 Delphi 源代码 通常是一个非常糟糕的主意。它充满了不一致和不良的编程习惯,以及在某些情况下编写的糟糕的代码。
      【解决方案4】:

      else 分支包含

      • 下一条语句(方法调用、赋值等)

        if x=5 then
          DoThis
        else
          DoThat; // <-- This is the complete else branch
        
      • 或标有begin和end的块

        if x=5 then
          DoThis
        else
        begin // <-- Here starts the else branch
          DoThat; 
          DoSomethingElse; 
        end; // <-- Here ends the else branch
        

      所以在你的情况下,这是整个 else 分支。

      Year:=Defaultyear;
      

      旁注: 格式化在这里无关紧要。它仅用于可读性目的。只有 begin 和 end 会更改 else 分支内的语句数量。

      【讨论】:

      • 谢谢。我感到困惑的原因是因为在给我的另一个 sn-p 中,有几行格式化为与else 下的下一条语句相同数量的空格。不确定它是否意味着有一个 begin/end 或者写它的人只是偶然缩进了这些行。
      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多