sizeof (int) * p
在语义上是什么意思?是吗:
1. sizeof( (int) *p )
或
2. ( sizeof(int) ) * p
什么规则使表达式以这种方式评估?
答案 0 :(得分:4)
sizeof
是一元运算符,其优先级高于二进制*
,因此表达式sizeof (int) * p
被解析为(sizeof (int)) * p
。这是解析树:
*
/ \
sizeof p
|
(int)
修改强>
来自onezero的评论:
但是不能像sizeof((int)* p)那样计算表达式,因为sizeof运算符,类型转换运算符和*(取消引用)运算符具有相同的优先级并且从右到左关联?
以下是相关语法(来自C2011标准的ballot draft):
(6.5.3) unary-expression: postfix-expression ++ unary-expression -- unary-expression unary-operator cast-expression sizeof unary-expression sizeof ( type-name ) alignof ( type-name )
如您所见,(int)
被解释为sizeof
表达式的一部分,完全停止。它不被解释为强制转换表达式的一部分。语法不允许sizeof
直接跟随强制转换表达式;必须有一元操作符(&
,*
,+
,-
,~
,{{1之一}}) 它们之间。
答案 1 :(得分:-1)
它不依赖于p是什么?
void main() { int p = 3; printf("%d", sizeof(int) *p); }
输出12。
void main() { char *p = "a"; printf("%d", sizeof((int) *p)); }
输出4。