考虑以下代码:
#include <fenv.h>
#include <stdio.h>
int main()
{
#pragma STDC FENV_ACCESS ON
1.0/0.0;
printf("%x\n", fetestexcept(FE_ALL_EXCEPT));
}
我希望它打印一个对应于的非零值FE_DIVBYZERO
,但它打印 0。更改第二行main
to double x = 1.0/0.0;
给出预期的行为。这是允许的还是一个错误?
Edit:无论如何,乍一看,在大多数现实世界的代码中,可能导致 fenv 异常引发的操作无法优化,因此可以安全地执行大型计算并在最后检查是否有任何溢出,除以零等情况发生。然而,当您考虑内联和优化时,事情会变得混乱并且出现真正的问题。如果这样的函数在由于常量参数而总是被零除的情况下内联,则 gcc 可能会得到真的很聪明并优化整个内联函数return INFINITY;
不提出任何例外。
这是预期的行为。 gcc 不会评估该表达式,因为之后它就与它无关。
如果使用“-Wall”进行编译,它会警告您该语句无效,并且会忽略 pragma 语句。
GCC 不完全符合 C99。有关更多信息,请参阅:http://gcc.gnu.org/c99status.html http://gcc.gnu.org/c99status.html
有关实现此行为的问题,请参阅:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20785 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20785
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)