C 复合文本中使用的强制转换和指针变量中使用的强制转换之间的差异?

C 复合文本中使用的强制转换和指针变量中使用的强制转换之间的差异?,c,compound-literals,C,Compound Literals,考虑以下代码: int main() { int *p; ++((int){5}); //compile without err/warning &((int){5}); //compile without err/warning ++((char *)p); //Compile-time err: invalid lvalue in increment &((char *)p); //Compile-time

考虑以下代码:

int main()
{ 
    int *p;

    ++((int){5});    //compile without err/warning
    &((int){5});     //compile without err/warning

    ++((char *)p);   //Compile-time err: invalid lvalue in increment
    &((char *)p);    //Compile-time err: invalid lvalue in unary '&'

}
为什么复合文字在这里不产生错误?

这是因为复合文字中的“强制转换”根本不是强制转换,它看起来就像一个强制转换

复合文字(是完整的结构
(int){5}
)创建左值。但是,与大多数其他运算符一样,强制转换运算符只创建右值

这个例子是允许的(但没用,就像你的
int
例子一样):


复合文字中没有类型转换。复合文本的
(int)
部分不是强制转换。它只是复合文字语法的类型部分。所以,在这种情况下,问题是复合文字是否是一个对象,一个左值。答案是肯定的,复合文字是左值。因此,您可以对它应用任何需要左值的运算符(如
++
&

示例的第二部分包含强制转换。强制转换的结果始终为右值。不能对右值使用
++
&

复合文字中的“强制转换”实际上是而不是强制转换,而是复合文字的类型。
因此,
(int){5}
实际上更像是一个匿名的
int
,因此一个有效的
lvalue
,可以在任何地方使用相同类型的对象(
int

然而,
(char*)p
实际上是一个强制转换(
rvalue
),因此它不能递增
++
或引用
&

了解复合文字

++((char *){(char *)p});
&((char *){(char *)p});