关于C++条件运算符与逗号运算符优先级的代码解析及《C++ Primer》内容的正确性验证
C条件运算符与逗号运算符优先级的代码解析及《C Primer》内容的正确性验证
嘿,咱们来好好拆解你遇到的这个问题,先看你提到的《C++ Primer》第三版里的这段代码:
int ival = (ia != 0) ? ix = get_value(), ia[index] = ix : ia = new int[sz], ia[index] = 0;
你提出的疑问完全切中要害,咱们先明确一个核心规则:条件运算符?:的优先级要高于逗号运算符,——这就是问题的关键!
原书里描述“冒号两边都是逗号表达式”,但实际编译器的解析逻辑和这个描述有偏差。因为优先级的关系,编译器会把这段代码拆解成这样:
int ival = ((ia != 0) ? (ix = get_value(), ia[index] = ix) : (ia = new int[sz])) , ia[index] = 0;
简单来说:
- 三元运算符的范围只到
ia = new int[sz],也就是冒号后面的第一个逗号前的部分才是三元运算的第二个分支 - 逗号后面的
ia[index] = 0已经不属于三元表达式了,它是和前面整个三元运算结果组成的一个独立逗号表达式的后半段
那这是不是书里的错误呢?更准确地说,这是一个容易误导读者的歧义写法。原书的描述没有明确指出优先级带来的实际编译行为,会让读者误以为冒号两边的逗号表达式都是三元运算符的分支,但实际运行逻辑和这个直观理解不一样。你发现的这个点是完全正确的,绝对不是你的错觉!
内容来源于stack exchange
相关产品推荐
相关产品推荐

