Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能给我解释一下这个奇怪的循环吗? 我对C++更新了,今天我看了一个游戏引擎主渲染循环,看起来像: for (register unsigned long long i = 0xaull; engine_tick(); kRuntimeStatistics::INSTANCE.FramesSinceStart++, ++ i);_C++_Loops_For Loop - Fatal编程技术网

有人能给我解释一下这个奇怪的循环吗? 我对C++更新了,今天我看了一个游戏引擎主渲染循环,看起来像: for (register unsigned long long i = 0xaull; engine_tick(); kRuntimeStatistics::INSTANCE.FramesSinceStart++, ++ i);

有人能给我解释一下这个奇怪的循环吗? 我对C++更新了,今天我看了一个游戏引擎主渲染循环,看起来像: for (register unsigned long long i = 0xaull; engine_tick(); kRuntimeStatistics::INSTANCE.FramesSinceStart++, ++ i);,c++,loops,for-loop,C++,Loops,For Loop,它为什么有尸体,什么时候离开?我以为for循环只适用于数字?那么0xaull在长i后面是什么意思?一般情况 不适用于任何类型的迭代处理。不仅仅是数字 声明 for (a;b;c) d; (几乎)和 { a; while (b) { d; c; } } 空体意味着主要的好处已经在a、b和c中 对你的陈述的申请 因此,对于你的声明: for (register unsigned long long i = 0xaull; en

它为什么有尸体,什么时候离开?我以为for循环只适用于数字?那么0xaull在长i后面是什么意思?

一般情况 不适用于任何类型的迭代处理。不仅仅是数字

声明

for (a;b;c) 
   d; 
(几乎)和

{
    a;
    while (b) {
        d; 
        c; 
    }
}
空体意味着主要的好处已经在a、b和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;  
    }
}
几句话:
  • 主体为空,行尾带有分号,极易出错(我花了一整晚调试了一些代码,只是为了弄清楚我没有看到分栏,所以缩进误导了我)。因此,我建议使用适当的缩进,以引起对潜在陷阱的注意
  • 由于编译器的优化器比手动选择寄存器变量做得更好,因此不再增加值。现在它甚至被弃用了
  • 允许在一个表达式中组合两个表达式。为了清楚起见,我在半专栏中翻译了这篇文章。请注意,
    ++i
    可能由于同样的原因在原始代码中被移动到for主体
  • 0xaull
    表示它是一个十六进制(
    0x
    ),值为
    a
    (十六进制中的a是10),类型为
    无符号long

当engine_tick()返回false时,它将退出。while语句不需要主体。
0xa末尾的ull只指定其为无符号long-long,而0x指定其为十六进制。

可能
引擎勾号
返回一个可计算为
的值。另外,这是非常糟糕的代码这相当于
而(true){if(!engine_tick())break;kRuntimeStatistics::INSTANCE.FramesSinceStart++;}
。大概是
engine\u tick()
函数调用完成了所有工作,它返回一个
bool
-ish类型,如果返回
false
y,它将停止循环。这很有意义!但是那是什么呢?但是代码是由专业人士编写的,它没有错,或者是错的?你的意思是可读性,对吗?
0xaull
0xa
(十六进制表示10)和
ull
unsigned long
)。代码在某种意义上是“正确的”,它没有错,但很难阅读并且过于复杂。我建议不要对
for()
循环使用空语句。我宁愿使用空块
{/*donothing*/}