-3

Very straight forward. The code below is from one of my functions:

int i, j;
for (i = 0; i < m; i++) {
    for (j = 0; j < numberOfVariables; j++) {
        if ((j % i) == 0 && i != 0) {
            table[i][j] = 1;
        }
    }
}

When I call it, I get a floating point exception. Except that I am working with no floating points. So what's happening exactly?

4

3 回答 3

8

i为零时,j % i涉及除以零,这是不允许的。

为了防止它,你需要改变它:

      if ((j % i) == 0 && i != 0) {

对此:

      if (i != 0 && (j % i) == 0) {

(利用 : 的短路行为,&&如果左侧操作数评估为假,则永远不会评估右侧操作数)。

于 2016-11-11T18:34:37.743 回答
1

考虑第一次迭代:

if ((j % i) == 0 && i != 0) {

&&并且||总是先计算左操作数,如果条件变为假,条件将短路。

这意味着当 时i != 0,它将首先j % i 评估,然后除以零。请注意,除以零是未定义的行为。

您需要将该行替换为:

if (i != 0 && (j % i) == 0) {

这样,当i == 0,(j % i) == 0不会被评估

但是不做这个检查,就不能直接避免这种情况吗?您可以简单地i1to迭代,m这样您也可以删除检查:

for (i = 1; i < m; i++) {

编辑:您声称遇到浮点异常的运行时可能是错误的,并将算术异常误认为是除以零;或者可能是由于编译器优化。类似的东西。

于 2016-11-11T18:39:56.887 回答
0

当您在循环中评估(j % i) == 0i=0,这是在后台除以 0。因此浮点异常。

int i,j;
  for (i = 0; i < m; i++) {
    for (j = 0; j < numberOfVariables; j++) {
      if (i != 0 && (j % i) == 0 ) {
        table[i][j] = 1;
      }
    }
  }

在运行时,它将评估i==0跳过模评估。您之前所做的方式是在验证之前评估模数i!=0

于 2016-11-11T18:38:20.110 回答