如果我像这样初始化变量:
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;
没有出错?
答案 0 :(得分:5)
由于||
的强制性短路评估以及您的表达式被评估为
static int i = (2 || (2 / 0));
由于2
是一个等于2
的表达式,因此不会评估2 / 0
。