2015-05-01 101 views
-8

我看到一些代码,我惊讶地看到一个条件语句。 我试过运行它,但循环变成了一个无限循环。混淆for循环中的条件语句

完整的代码是:

#include <iostream> 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    int *n; 
    for (int i=0; i<5e7; i++) 
    n = new int; 
    delete n; 
} 

如何,即使编译,为什么环路成为一个无限循环? 这些类型的条件语句是什么?

+3

5e7是50000000的科学计数法。 –

+0

等效代码为'for(int i = 0; i <5e7; i ++){n = new int; }' –

+3

这是很多内存泄漏。 – AndyG

回答

2

为了表示浮点常量C++标准引入了浮动文本( 2.14.4浮动文本)

floating-literal: 
fractional-constant exponent-partopt floating-suffixopt 
digit-sequence exponent-part floating-suffixopt 
fractional-constant: 
digit-sequenceopt. digit-sequence 
digit-sequence . 
exponent-part: 
e signopt digit-sequence 
E signopt digit-sequence 
sign: one of 
+ - 
digit-sequence: 
digit 
digit-sequence ’opt digit 
floating-suffix: one of 
f l F L 

因此5e7是浮动文字。你可以在控制台例如通过以下方式

std::cout << std::fixed << std::setprecision(0) << 5e7 << std::endl; 

和输出将是

50000000 

根据通常的算术转换在这种情况下

i < 5e7 

变量的规则将其输出i被转换为double(因为浮动文字的类型为double),并与浮点文字进行比较。只要我会大于或等于浮点文字,循环就会停止迭代。当int类型的最大值不小于浮点文字的值时,可能会发生这种情况。

您可以检查类型int以下方式的目标的最大值

#include <limits> 

//... 
std::cout << std::numeric_limits<int>::max() << std::endl; 

哪里运行这段代码,我得到了以下结果

2147483647 

因此这些值的环能不是无限的。然而,也许在你的系统中,最大值int小于浮点文字的值。在这种情况下,循环确实是无限的。

+0

我不知道int会被转换为浮点数。为什么这样,而不是相反呢? –

+0

@Mustafa Ozturk假设类型double可以包含至少与它们的幅度无关的任何整数值。 –