在for循环中混淆条件语句

时间:2015-05-01 19:02:14

标签: c++ c++11

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

完整的代码是:

#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; 
}  

如何编译,为什么循环变成无限循环? 这些条件陈述是什么?

1 个答案:

答案 0 :(得分: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的最大值小于浮动文字的值。在这种情况下,循环确实是无限的。