为什么常量表达式不报错?
Why doesn't constant expression give an error?
如果我这样初始化变量:
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
没有计算。
如果我这样初始化变量:
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
没有计算。