With a type as operand

Evaluates into the size in bytes, of type size_t, of objects of the given type. Requires parentheses around the type.

printf("%zu\\n", sizeof(int)); /* Valid, outputs the size of an int object, which is platform-dependent. */
printf("%zu\\n", sizeof int); /* Invalid, types as arguments need to be surrounded by parentheses! */

With an expression as operand

Evaluates into the size in bytes, of type size_t, of objects of the type of the given expression. The expression itself is not evaluated. Parentheses are not required; however, because the given expression must be unary, it’s considered best practice to always use them.

char ch = 'a';
printf("%zu\\n", sizeof(ch)); /* Valid, will output the size of a char object, which is always 1 for all platforms. */
printf("%zu\\n", sizeof ch);  /* Valid, will output the size of a char object, which is always 1 for all platforms. */