Что означает sizeof (int) * p
семантически? Является ли это:
1. sizeof((int) *p)
или
2. (sizeof(int)) * p
и что правило делает выражение, вычисляемое таким образом?Что означает sizeof (int) * p семантически?
ответ
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
следовать непосредственно с помощью выражения ; должен быть Унарный-оператор (один из &
, *
, +
, -
, ~
, !
) между ними.
Не зависит от того, что такое p?
void main() { int p = 3; printf("%d", sizeof(int) *p); }
Выведет 12.
void main() { char *p = "a"; printf("%d", sizeof((int) *p)); }
Выведет 4.
Нет, это не зависит от того, что такое p? Во втором примере вы получаете результат как 4, потому что вы явно ввели скобки, тем самым вынуждая компилятор оценивать выражение в контексте, соответствующем (где p является указателем). – onezero
Возможно, вы также можете ссылаться на статью в Википедии, в которой объясняется, что именно вы сказали в одной красивой таблице: [приоритет оператора C/C++] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence) – Alex
@JohnBode, но не может быть оценено выражение как 'sizeof ((int) * p)', поскольку оператор sizeof, оператор типа-литья и оператор * (разыменования) имеют одинаковый приоритет и ассоциируются справа налево? – onezero
@Alex: тьфу. Я хотел бы, чтобы они разделили его на две отдельные таблицы: одну для C и одну для C++ (они * - * два разных языка, в конце концов). –