2012-06-22 2 views

ответ

4

sizeof является унарный оператор, который имеет более высокий приоритет, чем двоичный *, так что выражение sizeof (int) * p обрабатывается как (sizeof (int)) * p. Вот дерево разбора:

   * 
     / \ 
     sizeof p 
     | 
     (int) 

Редактировать

Из комментария onezero в:

но не выражение оценивается как SizeOf ((INT) * р), в качестве оператора SizeOf , оператор типа-литья и оператор * (разыменования) имеют одинаковый приоритет и ассоциируются справа налево?

Вот соответствующий синтаксис (от ballot draft стандарта C2011):

 
(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 следовать непосредственно с помощью выражения ; должен быть Унарный-оператор (один из &, *, +, -, ~, !) между ними.

+0

Возможно, вы также можете ссылаться на статью в Википедии, в которой объясняется, что именно вы сказали в одной красивой таблице: [приоритет оператора C/C++] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence) – Alex

+0

@JohnBode, но не может быть оценено выражение как 'sizeof ((int) * p)', поскольку оператор sizeof, оператор типа-литья и оператор * (разыменования) имеют одинаковый приоритет и ассоциируются справа налево? – onezero

+0

@Alex: тьфу. Я хотел бы, чтобы они разделили его на две отдельные таблицы: одну для C и одну для C++ (они * - * два разных языка, в конце концов). –

-1

Не зависит от того, что такое p?

 
void main() 
{ 
    int p = 3; 

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

Выведет 12.

 
void main() 
{ 
    char *p = "a"; 

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

Выведет 4.

+2

Нет, это не зависит от того, что такое p? Во втором примере вы получаете результат как 4, потому что вы явно ввели скобки, тем самым вынуждая компилятор оценивать выражение в контексте, соответствующем (где p является указателем). – onezero