c - 为什么常量表达式不报错?

标签 c initialization c11

<分区>

如果我这样初始化变量:

static int i = 2 * 2 / 0;

然后,编译器给我一个错误。

prog.c: In function 'main':
prog.c:5:23: warning: division by zero [-Wdiv-by-zero]
  static int i = 2 * 2 / 0; 
                       ^
prog.c:5:17: error: initializer element is not constant
  static int i = 2 * 2 / 0; 

但是,如果我使用 || 而不是 *,就像这样:

static int i = 2 || 2 / 0; 

那么就编译成功了。

根据 Operator Precedence , * 的优先级高于 ||。因此,首先对 2/0 操作求值。我说得对吗?

那么,为什么 static int i = 2 || 2/0; 报错?

最佳答案

这是由于 || 的强制短路评估以及您的表达式被评估为

static int i = (2 || (2 / 0));

因为 2 是一个等于 2 的表达式,所以 2/0 不被计算。

关于c - 为什么常量表达式不报错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46034672/

相关文章:

c - 搜索/删除时出现 2-3 棵树分割错误

objective-c - 使用字典值动态填充对象属性

c++ - 在 C++ 中初始化 vector 时获取错误消息

c - 在 C11 中使用 _Generic 宏失败

c - 如何将 C 函数移动到单独的文件中?

c - R_X86_64_32S 和 R_X86_64_64 重定位是什么意思?

c - C 中单元测试的自动生成器

cocoa-touch - 使用 loadNibNamed 时未初始化子类 UITableViewCell

c - 是否可以在编译时确定实现是否提供精确宽度的整数类型?

c - 当描述符重叠时,C11 数组初始化的行为是什么?