2013-09-19 2 views
7

Автор this question только что посмеялся над мной, когда я спросил его, что sizeof * q делает ... Он сказал мне, что это действительно основной вопрос C, и я должен его проверить. Но когда я огляделся вокруг и не видел, чтобы кто-то спрашивал раньше, я сделаю это сейчас самостоятельно:Что делает sizeof без()?

Что делает sizeof в C, когда оно используется без круглых скобок и/или типа?

+3

Я мог ошибаться, но считаю, что sizeof (expr) совпадает с sizeof expr. Без сомнения, кто-то меня исправит, если я ошибаюсь! –

+7

Вы писали: «Ха-ха, это смешно, вы спрашиваете нас, что вы думаете, делая это xD». Не удивляйтесь, что он не отвечает вам правильно после этого ... –

+0

Релевантно: [Почему sizeof считается оператором?] (Http://stackoverflow.com/questions/1393582/why-is-sizeof-considered -по ан-оператор/1393592) –

ответ

20

Так что, если мы посмотрим на грамматике sizeof в разделе C99 draft standard6.5.3унарными пункт это выглядит следующим образом:

sizeof unary-expression 
sizeof (type-name) 

Существует разница, которую вы не можете использовать тип- наименование без скобок и раздела 6.5.3.4Оператор размера п. говорит (акцент m ине):

Оператор SizeOf дает размер (в байтах) своего операнда, который может быть выражением или в скобках имя типа [...]

.

Для полноты вы можете задаться вопросом, можем ли мы использовать sizeof с выражением, если у нас есть круглые скобки, и ответ да, так как унарное выражение может содержать в себе скобки. Самый простой способ увидеть это будет выглядеть раздел A.2.1Выражения из проекта стандарта и работы по грамматике, как так:

unary-expression -> postfix-expression -> primary-expression -> (expression) 
19

sizeof является оператором, а не функцией, поэтому вам не нужен (), если операнд является выражением (но вы обычно используете их). sizeof * q == sizeof(*q). Обратите внимание, что если операнд типа, вы должны использовать (), так sizeof(int) (смотри, например http://en.wikibooks.org/wiki/C_Programming/Reference_Tables)

sizeof  sizeof operator for expressions sizeof 123 
sizeof() sizeof operator for types  sizeof (int) 

Теперь даже wiki полна информаций о С ... Мир меняется быстро: -)

Оператор sizeof используется для определения объема пространства, которое определенный тип данных будет занимать в памяти. Чтобы использовать sizeof, за ключевым словом «sizeof» следует имя типа или выражение (которое может быть просто именем переменной). Если используется имя типа, оно всегда должно быть заключено в круглые скобки, тогда как выражения могут быть указаны с круглыми скобками или без них.

3

То же, что и sizeof с скобкой. Это правый унарный оператор, поэтому он обрабатывает его правый размер как операнд.
Насколько я знаю, paranthesis являются обязательными при использовании sizeof с базовыми типами данных.

Когда у вас есть переменная int a вы можете проверить его размер в обоих направлениях, круглые скобки не являются обязательными: sizeof a, sizeof (a) будет работать так же.
Но при проверке только размера int только sizeof (int) будет работать.

2

То же самое происходит с парнерами - он возвращает размер того, что вы его передаете, в этом случае размер всего, на что указывает q.

Это несколько менее понятно, особенно если мы связаны с комплексными вызовами malloc и sizeof, поэтому считаю, что лучше всего использовать парсеры.

7

sizeof является оператора, в частности, унарный оператор, как одноместный & или ++ , Он принимает либо унарное выражение, либо имя типа, окруженное parens как его операнд.

Синтаксис является

 
    sizeof unary-expression 
    sizeof (type-name) 

Так что, учитывая заявление как

int *q; 

выражения sizeof *q и sizeof (int) эквивалентны, так же как и sizeof qsizeof (int *).

Смежные вопросы