Может кто-нибудь объяснить мне этот странный цикл? - PullRequest
0 голосов
/ 14 марта 2019

я новее c ++, и сегодня я посмотрел на основной цикл рендеринга игрового движка, который выглядел так:

for (register unsigned long long i = 0xaull; engine_tick(); kRuntimeStatistics::INSTANCE.FramesSinceStart++, ++ i); 

Почему у него было какое-то тело и когда оно выходило?Я искал петли ar только для чисел: / А что 0xaull означает за длинным i?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 14 марта 2019

Общий случай

Нет, цикл for предназначен для любого вида итеративной обработки.Не только для чисел.

Выражение

for (a;b;c) 
   d; 

(почти) совпадает с

{
    a;
    while (b) {
        d; 
        c; 
    }
}

Пустое тело означает, что основное преимущество уже ва, б и в.

Приложение к вашему заявлению

Итак, к вашему заявлению:

for (register unsigned long long i = 0xaull; engine_tick(); kRuntimeStatistics::INSTANCE.FramesSinceStart++, ++ i); 

это то же самое, что

{
    register unsigned long long i = 0xaull;
    while (engine_tick()) {
        kRuntimeStatistics::INSTANCE.FramesSinceStart++; 
        ++ i;  
    }
}

Несколько замечаний:

  • пустой для тела, с точкой с запятой в конце строки, чрезвычайно подвержен ошибкам (я потратил целую ночь на отладку некоторого кода один раз, просто чтобы выяснить, что я не видел точку с запятой, так что я былвводить в заблуждение отступом).Поэтому я бы рекомендовал ставить точку с запятой на следующей строке с правильным отступом, просто чтобы обратить внимание на потенциальную ловушку.
  • register не имеетболее длинная добавленная стоимость, так как оптимизатор компилятора выполняет намного лучшую работу, чем ручной выбор переменных регистра.Это даже не рекомендуется сейчас.
  • оператор запятой позволяет объединять два выражения в одно.Я перевел это в полуколонку для ясности.Обратите внимание, что ++i мог быть перемещен в тело for в исходном коде по той же причине.
  • 0xaull означает, что это шестнадцатеричное литерал (0x) со значением a (A в шестнадцатеричном виде равно 10) типа unsigned long long.
2 голосов
/ 14 марта 2019

Будет завершено, когда engine_tick () вернет false. Некоторое утверждение не нуждается в теле. Ull в конце 0xa просто указывает, что это длинный без знака long, а 0x указывает, что это в шестнадцатеричном формате.

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