浮点异常?
Floating point exception?
非常直接。下面的代码来自我的一个函数:
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;
}
}
}
当我调用它时,出现浮点异常。除了我没有使用浮点数。那么到底发生了什么?
当i
为零时,j % i
涉及被零除,这是不允许的。
要防止它,您需要更改此设置:
if ((j % i) == 0 && i != 0) {
对此:
if (i != 0 && (j % i) == 0) {
(利用 &&
的 短路 行为:如果左侧操作数的计算结果为 false,则右侧操作数永远不会评估)。
当您在循环中为 i=0
计算 (j % i) == 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
.
之前评估模数
考虑第一次迭代:
if ((j % i) == 0 && i != 0) {
&&
和||
总是先计算左操作数,如果条件为假,则条件短路。
这意味着当 i != 0
时,它 将 评估 j % i
首先 ,因此除以零.请注意,除以零是未定义的行为。
您需要将该行替换为:
if (i != 0 && (j % i) == 0) {
这样,当i == 0
时,(j % i) == 0
不会被计算
但是你不做这个检查,你就不能直接避免这种情况吗?您可以简单地将 i
从 1
迭代到 m
,这样您也可以删除检查:
for (i = 1; i < m; i++) {
编辑:您声称遇到浮点异常的运行时可能是错误的,并将算术异常误认为是被零除;或者可能是由于编译器优化。类似的东西。
非常直接。下面的代码来自我的一个函数:
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;
}
}
}
当我调用它时,出现浮点异常。除了我没有使用浮点数。那么到底发生了什么?
当i
为零时,j % i
涉及被零除,这是不允许的。
要防止它,您需要更改此设置:
if ((j % i) == 0 && i != 0) {
对此:
if (i != 0 && (j % i) == 0) {
(利用 &&
的 短路 行为:如果左侧操作数的计算结果为 false,则右侧操作数永远不会评估)。
当您在循环中为 i=0
计算 (j % i) == 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
.
考虑第一次迭代:
if ((j % i) == 0 && i != 0) {
&&
和||
总是先计算左操作数,如果条件为假,则条件短路。
这意味着当 i != 0
时,它 将 评估 j % i
首先 ,因此除以零.请注意,除以零是未定义的行为。
您需要将该行替换为:
if (i != 0 && (j % i) == 0) {
这样,当i == 0
时,(j % i) == 0
不会被计算
但是你不做这个检查,你就不能直接避免这种情况吗?您可以简单地将 i
从 1
迭代到 m
,这样您也可以删除检查:
for (i = 1; i < m; i++) {
编辑:您声称遇到浮点异常的运行时可能是错误的,并将算术异常误认为是被零除;或者可能是由于编译器优化。类似的东西。