Считаете ли вы этот плохой стиль кодирования? - PullRequest
1 голос
/ 31 августа 2011

Я видел этот код сегодня:

 if(++counter == 10)
{

 //Do Something
 foo();

 }

Я думаю, что это плохой стиль, но зависит ли компилятор выполнения также? скажем, счетчик установлен в 8, прежде чем мы доберемся до этой строки, он будет увеличивать его, затем сравнить 10–8, значение до или сравнить 10–9, значение счетчика после его увеличения?

Что ты думаешь ТАК? Это обычная практика? плохой стиль?

Ответы [ 4 ]

12 голосов
/ 31 августа 2011

Нет ничего зависящего от компилятора в поведении этого кода (кроме возможного поведения переполнения).Хороший ли это стиль - вопрос личных предпочтений.Я обычно избегаю внесения изменений в условные выражения, но иногда это может быть полезно и даже элегантно.

Этот код гарантированно сравнивает значение new с 10 (т. Е. 9 сравнивается с 10 в вашемпример).Формально неверно говорить, что сравнение происходит после увеличения counter.Здесь нет «до» или «после».Новое значение может быть предварительно рассчитано и сравнено с 10 даже до того, как оно физически помещено в counter.

Другими словами, оценка ++counter == 10 может продолжаться как

counter = counter + 1
result = (counter == 10)

или как

result = ((counter + 1) == 10)
counter = counter + 1

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

2 голосов
/ 31 августа 2011

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

0 голосов
/ 31 августа 2011

Это хорошо определяется стандартом языка, и то, является ли это плохим стилем или нет, зависит от личных предпочтений, а также от контекста. У меня есть одна функция, использующая условия, подобные этим, которые, на мой взгляд, выглядят и работают очень хорошо, и которые, по-моему, были бы менее читабельными, когда приращение было бы выведено из условия.

const char *GetStat(int statId)
{
  int id = 0;
  if (statId==id++)
  {
    return "Buffers";
  }
  else if (statId==id++)
  {
    return "VBuffers";
  }
#ifndef _XBOX
  else if (statId==id++)
  {
    return "Reset factor";
  }
#endif
  else if (statId==id++)
  {
    return "CB Mem";
  }
  return "";
}

Примечание: приращения здесь вообще не "выполняются", приличный компилятор исключит переменную ++, выполненную для id, в константы.

0 голосов
/ 31 августа 2011

Лично я бы всегда разделял это на два утверждения.

counter++;
if (counter == 10)
    DoSomething();

Таким образом, вам не нужно думать о том, в каком порядке все происходит - нет места для путаницы. Это не имеет значения для сгенерированного кода, и когда это так, проблемы читабельности и удобства обслуживания всегда важны.

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