Yes, there is a difference. The parentheses are needed so that the result of the macro is evaluated as a single expression, rather than being mixed with the surrounding context where the macro is used.
The output of this program:
#include <stdio.h>
#define TAM_ARRAY(a) (sizeof(a)/sizeof(*a))
#define TAM_ARRAY2(a) sizeof(a)/sizeof(*a)
int main(void)
{
int x[4];
printf("%zu\n", 13 % TAM_ARRAY (x));
printf("%zu\n", 13 % TAM_ARRAY2(x));
}
is, in a C implementation where int
is four bytes:
1
3
because:
13 % TAM_ARRAY (x)
is replaced by 13 % (sizeof(x)/sizeof(*x))
, which groups to 13 % (sizeof(x) / sizeof(*x))
, which evaluates to 13 % (16 / 4)
, then 13 % 4
, then 1
.
13 % TAM_ARRAY2(x)
is replaced by 13 % sizeof(x)/sizeof(*x)
, which groups to (13 % sizeof(x)) / sizeof(*x)
, which evaluates to (13 % 16) / 4
, then 13 / 4
, then 3
.
Along these lines, TAM_ARRAY
would be better to include parentheses around the second instance of a
as well:
#define TAM_ARRAY(a) (sizeof(a)/sizeof(*(a)))