Как вы пишете неоперативное заявление? - PullRequest
2 голосов
/ 24 сентября 2011

Каков наилучший способ написать оператор no-op в Delphi?

Возьмите этот код:

if a=b then
  SomeOldStatement
else
  AnotherStatement;

И скажите, что вы временно хотите исключить SomeOldStatement.

Вы бы просто пошли на это решение:

if a=b then
  //SomeOldStatement
else
  AnotherStatement;

Лично мне не нравится пустой раздел then, и я хотел бы, чтобы что-то компилировалось там ...

if a=b then
  NoOp
  //SomeOldStatement
else
  AnotherStatement;

Ответы [ 7 ]

14 голосов
/ 24 сентября 2011

Не знаю, зачем вам вообще что-то там нужно (например, я доволен "тогда еще").

Но если вы хотите что-то скомпилировать, я бы сделал это:

if a=b then
  begin end
  //SomeOldStatement
else
  AnotherStatement;

Пустой начальный блок - лучший noop, который я знаю в Delphi.Он не будет генерировать ассемблерный код и, следовательно, не будет накладных расходов.

12 голосов
/ 24 сентября 2011
if a=b then 
  SomeOldStatement 
else 
  AnotherStatement; 

должно быть записано как

if a=b then
begin
  SomeOldStatement;
end 
else
begin
  AnotherStatement; 
end;

теперь вы можете комментировать SomeOldStatement; с именно тем эффектом, который вам нужен, отладчик более точно следит за потоком кода И вы избегаете странных побочных эффектов в коде, подобном

if a=b then
  if b=c then
    statement1
  else
    if c=d then
      statement2;
  else
   statement2
else 
  statement3;

облажай свои отступы, неправильно введи точку с запятой, документируй строку для тестирования и святое дерьмо, все станет ужасно быстро.

серьезно, попробуйте выяснить, является ли код, который я только что написал, действительным даже без прохода компилятора.

Теперь, угадайте, что происходит с этим:

if a=b then
if b=c then
statement1
else
if c=d then
statement2;
// else
statement2
else 
statement3;

также:

if a=b then
  statement1;
  statement2;

часто может делать странные вещи, и даже странные вещи, когда вы делаете

if a=b then
//  statement1;
statement2;

серьезно - просто привыкните ВСЕГДА иметь начальные концы во всей вашей логике - это облегчает отслеживание вашего кода, избегает побочных эффектов, избегает умственных ошибок разбора, ошибок разбора кода и комментирования побочных эффектов.

Плюс, пустое начало / конец такое же, как и у вашего неоперационника.

6 голосов
/ 24 сентября 2011

В Delphi 2005 и последующих версиях вы можете определить пустую процедуру NoOp и пометить ее как inline.

. Таким образом, код не генерируется, если вы не определите {$INLINE OFF} или не установите Управление встраиванием кода в Выкл. в Опции компилятора .

procedure NoOp; inline;
begin
  // do nothing
end;

Полученный код очень чистый:

if a=b then
  NoOp //SomeOldStatement
else
  AnotherStatement;
3 голосов
/ 24 сентября 2011

Возможно, вы можете использовать что-то вроде a:=a, но, если честно, я считаю, что даже уродливее , чем не высказывание - вы должны писать так, чтобы те, кто придет после вас, поняли, что вы хотели и команда a:=a действительно не следует этой рекомендации.

Поскольку это всего лишь временная вещь, я бы просто сказал, что у вас нет исполняемого кода. Если, как вы говорите, Delphi по-прежнему хорошо его компилирует, у вас нет проблем.

Если вам нужен некоторый код для точки останова, , и лучшего способа сделать это не существует, я бы подумал о временном выполнении операции a:=a.

Если бы это было более постоянное изменение, вы могли бы вместо этого рассмотреть изменение условия, чтобы у вас не было пустых блоков вообще:

if not (a = b) then
    AnotherStatement;

или, еще лучше:

if a <> b then
    AnotherStatement;
2 голосов
/ 08 июля 2016

Это лучший вариант. Я широко использую его для отладки, потому что могу поставить точку останова, не зависит от другого модуля, не мешает вашей программе, а также намного быстрее, чем условные точки останова.

if a=b then
  asm nop end
else
  AnotherStatement;
2 голосов
/ 24 сентября 2011

Как насчет назначения, a := a?Это не работает.

(я не знаю Delphi, поэтому синтаксис для назначения может быть неправильным, но, надеюсь, вы сможете понять идею и исправить синтаксис при необходимости)

1 голос
/ 25 сентября 2011

Если операторы без блока begin end являются ошибкой, ожидающей возникновения, и в этом случае добавление в блок begin end позволит вам закомментировать вашу строку, не изменяя больше кода.

...