Delphi常量按位表达式

rob*_*oft 6 delphi compiler-construction optimization

可能是一个愚蠢的问题,但这对我来说是一种空洞的好奇心.

我有一些看起来像这样的Delphi代码;

const
  KeyRepeatBit = 30;

...
  // if bit 30 of lParam is set, mark this message as handled
  if (Msg.lParam and (1 shl KeyRepeatBit) > 0) then
    Handled:=true;
...

(代码的目的并不重要)

编译器是否将"(1 shl KeyRepeatBit)"视为可以在编译时计算的内容,因此它变为常量?如果没有,是否可以通过将其作为数字进行处理并用数字替换表达式来获得任何收益?

Ond*_*lle 7

是的,编译器在编译时计算表达式,并将结果值用作常量.用自己的结果值声明另一个常量是没有收获的.

编辑:The_Fox是正确的.可分配的类型常量(请参阅{$J+}编译器指令)不会被视为常量,并且在这种情况下会在运行时计算表达式.