关于一元&运算符是否为唯一允许不完全对象类型操作数且不触发未定义行为的运算符的确认问询
确认:一元
&运算符是否是唯一允许不完全对象类型操作数且不触发未定义行为的运算符? 嘿,这个问题挖得相当细致啊!咱们来把这个逻辑捋得明明白白:
首先你提到的Sun Studio文档内容是准确的:
Sun Studio 12: C User's Guide 中指出:大多数表达式运算符要求操作数为完整对象类型,仅有的三个例外是一元
&运算符、逗号运算符的第一个操作数,以及?:运算符的第二个和第三个操作数。
但这里的“例外”只是语法层面允许使用,并不代表不会触发未定义行为——你观察到的点非常关键:
- 对于
?:运算符的第二、第三个操作数,当它们是不完全类型时,会触发左值转换,而根据C标准,这种转换对不完全类型属于未定义行为; - 逗号运算符的第一个操作数也是同理,最终会因为左值转换的要求,让不完全类型操作数引发UB。
再结合C11标准6.3.2.1p2里的左值转换例外规则来看:只有一元&运算符在处理不完全对象类型操作数时,不需要进行左值转换,因此完全符合标准要求,不会触发未定义行为。
所以你的结论是完全正确的:一元&运算符确实是唯一允许不完全对象类型操作数且不会触发未定义行为的运算符。
备注:内容来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

