It still behaves as an operator. Cast is also operator and also evaluates it’s argument and so does *
or &
. Being an operator is a syntactic category. That does not change.
The important distinction is that it behaves as expression while in other cases it behaves as constant.
Update: I commented below that I don’t see why the evaluation makes difference, but now I realized there are two ways you can write sizeof with variable length array. Either you can pass variable declared as variable lenght array:
int a[x];
sizeof(a)
in which case evaluating a
indeed makes no difference. But you can also use a type as the argument, which would be
sizeof(int[x])
and in this case the result is x * sizeof(int)
and x
must be evaluated. Which I suppose is why the specification mentions it.