Hacker News new | ask | show | jobs
by noselasd 4037 days ago
It's an unary operator, with 2 forms:

   sizeof(type)
or

  sizeof expression
but e.g. unlike a function, it doesn't evaluate the expression.

    sizeof(my_function()) doesn't call my_function.

    sizeof(a = 12) doesn't assign 12 to a.
2 comments

That's a language design choice - not a conceptual argument.
So is "sizeof(a = 12)" equivalent to just "sizeof(a)"?
Well, `a` could overload the "=" operator, in which case you would get `sizeof(a.operator=(12))`. But as far as pure C goes I believe you are right.

Edit: Via the C99 spec (http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf).

The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.

The type of an assignment expression is the type of the left operand unless the left operand has qualified type, in which case it is the unqualified version of the type of the left operand.

So it is indeed the case that `sizeof(a = 12)` is equivalent to `sizeof(a)` in the C world.

An interesting result of this (I suppose...) is that if a macro expands an argument twice, and one of those times is an operand for sizeof, you don't need to mention the double expansion in the documentation.