2

sizeof (int) * p语义上是什么意思?是:
1.sizeof( (int) *p )
还是
2.( sizeof(int) ) * p
是什么规则使表达式以这种方式被评估?

4

2 回答 2

4

sizeof是一元运算符,其优先级高于二元*,因此表达式sizeof (int) * p被解析为(sizeof (int)) * p. 这是解析树:

             *
           /   \
       sizeof   p
         |
       (int)

编辑

来自 onezero 的评论:

但是不能像 sizeof( (int) *p ) 那样评估表达式,因为 sizeof 运算符、类型转换运算符和 *(dereference) 运算符具有相同的优先级并且从右到左关联?

以下是相关语法(来自C2011 标准的投票草案):

(6.5.3) unary-expression :
     postfix-expression 
    ++ unary-expression 
    -- unary-expression 
    unary-operator cast-expression 
    sizeof unary-expression 
    sizeof ( type-name )
    alignof (类型名)

如您所见, the(int)被解释为sizeof表达式的一部分,句号。它不被解释为cast-expression的一部分。语法不允许sizeof直接跟在cast-expression后面;它们之间必须有一个一元运算符&, *, +, -, ~,之一!)。

于 2012-06-22T18:12:19.203 回答
-1

这不取决于 p 是什么吗?

无效的主要()
{
   诠释 p = 3;

   printf("%d", sizeof(int) *p);
}

将输出 12。

无效的主要()
{
   字符 *p = "a";

   printf("%d", sizeof((int) *p));
}

将输出 4。

于 2012-06-22T17:42:46.280 回答