_Alignof with operand of variable length array type: 标准是否有矛盾?

_Alignof with operand of variable length array type: is there a contradiction in the standard?

C2x,6.5.3.4 sizeof 和 _Alignof 运算符,语义,2(强调已添加):

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.

C2x,6.7.6.2 数组声明符,语义,5(添加了重点):

Where a size expression is part of the operand of an _Alignof operator, that expression is not evaluated.

考虑这段代码:

int f(void)
{
    return _Alignof( int(*)[ f() ] );
}

问题:f()应该被调用吗?

根据 6.5.3.4,操作数的类型是可变长度数组类型 => 计算操作数。

根据 6.7.6.2,大小表达式是 _Alignof 运算符的操作数的一部分 => 不计算该表达式。

标准是否有矛盾?

如果不是,那么是否意味着6.7.6.2的优先级高于6.5.3.4?

标准被忽略了。

没有矛盾。

澄清一下:

C11,6.5.3.4 sizeof 和 _Alignof 运算符,语义,3(强调已添加):

The _Alignof operator yields the alignment requirement of its operand type. The operand is not evaluated and the result is an integer constant.

表示在

_Alignof( int(*)[ f() ] )

那个

int(*)[ f() ]

未评估。

因此,f() 没有被调用。

额外:ICC 不正确地产生错误:

int f(void);
int s = _Alignof( int(*)[ f() ] );

$ icc -std=c11 -pedantic -Wall -Wextra -c
error: function call is not allowed in a constant expression

此处允许函数调用,因为这样的函数调用是

contained within a subexpression that is not evaluated