为什么常量表达式不会出错?

时间:2017-09-04 10:01:43

标签: 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;没有出错?

1 个答案:

答案 0 :(得分:5)

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

的事实
static int i = (2 || (2 / 0));

由于2是一个等于2的表达式,因此不会评估2 / 0