发现一个奇怪的除零的表达式在C语言中不会报错

Jac*_*son 2 c gcc

我发现表达式除以0不会报错。如果有人能告诉我原因,我将不胜感激。这是代码

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main() { 
  int result = 3/10*(7/0);
  printf("%d\n", result);
  //printf("%" PRIu64, result); 
  return 0; 
}
Run Code Online (Sandbox Code Playgroud)

环境:

  • 乌班图22.04
  • 海湾合作委员会 11.3.0

编译结果: 在此输入图像描述

运行结果: 在此输入图像描述

我已经使用 gdb 来调试程序,我发现编译器会优化表达式(我的猜测)。所以我怀疑这是 gcc 中的一个错误。 在此输入图像描述

Joh*_*ger 9

我发现表达式除以0不会报错。如果有人能告诉我原因,我将不胜感激。

就 C 语言规范而言,除以零会产生未定义的行为。不要求在编译时或运行时诊断情况,也不要求任何特定结果。

但事实上,您的编译器确实通过发出警告来诊断它。使用 gcc,如果您想确保不能忽略该警告,则启用-Werror将警告转换为错误,或者-Werror=div-by-zero如果您想对此更有选择性,则启用。

我已经使用 gdb 来调试程序,我发现编译器会优化表达式(我的猜测)。

有道理。

所以我怀疑这是 gcc 中的一个错误。

没有。除以零是程序中的一个错误。gcc 对此所做的可能不是您所期望的,但这并不会使 gcc 出现错误。