是否有另一种方法可以在不使用-MAXINT的情况下执行此case语句?

时间:2013-09-12 00:58:22

标签: delphi switch-statement

我有一个case语句,用于计算结果代码的整数(函数结果),如下所示:

  R:= DoSomething;
  case R of
    0: begin
      //Success
    end;
    1..99: begin
      //Specific result messages
    end;
    100..199: begin
      //Other specific result messages
    end;        
    -MAXINT..-1: begin
      //Failure
    end;
  end;

如果失败,则返回表示错误代码的负数。 DoSomething只是返回整数作为响应代码(或错误代码,为负数)的任何函数。如果是错误,它将被传递给另一个错误处理程序。如果它成功,它将被传递给成功处理程序(继续等)。正值将由各种特定处理程序处理。

我想知道是否还有另一种写-MAXINT..-1的方法。更像“Anything -1 and under”之类的东西。我试过<=-1,但编译器不太喜欢它。

在案例陈述中有没有办法做到这一点?

2 个答案:

答案 0 :(得分:5)

对所有未处理的结果使用else块,并在该块中区分失败的执行和没有显式处理程序的成功执行(最后一种情况是您似乎没有在您的示例代码中考虑。)

  R:= DoSomething;
  case R of
     0: begin
       //Success
     end;
     1: begin
       // Another success
     end
     else begin
        if R >= 0 then 
           // Unhandled successful execution error
        else 
           //Failure
       end;
   end;

答案 1 :(得分:3)

您正在尝试强制使用严格case,而应使用ifcase的组合:

if R = 0 then
  // Success
else 
  if R < 0 then
    // Failure
  else
  begin  // Positive values
    case R of
       1..99: ...
     100..199: ...
     // Other expected values
     else
       // Unexpected positive value
     end;
  end;

我个人会格式化以上内容以使流程更加清晰,但这是我自己的偏好:

if R = 0 then
  // Success
else if R < 0 then
  // Failure
else
begin  // Positive values
  case R of
     1..99: ...
   100..199: ...
   // Other expected values
   else
     // Unexpected positive value
   end;
end;

或者,更好的(正如拉里在回答我的回答中所提到的那样,但奇怪的是不在他的回答中):

if R < 0 then
  // Failure
else
begin
  case R of 
      0:  // Success
      1..99: // Expected positive values
    100..199:
  else
      // Unexpected positives
  end;
end;