首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在复合文字中使用的强制转换和在指针变量上执行的强制转换之间的区别?

在复合文字中使用的强制转换和在指针变量上执行的强制转换之间的区别?
EN

Stack Overflow用户
提问于 2010-03-09 13:47:51
回答 3查看 260关注 0票数 2

考虑以下代码:

代码语言:javascript
复制
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 '&'

}

为什么复合文字不会在这里生成错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-09 13:55:33

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

复合文字(这是完整的构造(int){5})创建一个左值。然而,强制转换操作符只创建一个右值,就像大多数其他操作符一样。

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

代码语言:javascript
复制
++((char *){(char *)p});
&((char *){(char *)p});
票数 4
EN

Stack Overflow用户

发布于 2010-03-09 13:56:56

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

示例的第二部分包含类型转换。强制转换的结果始终是右值。不能将++&与rvalues一起使用。

票数 4
EN

Stack Overflow用户

发布于 2010-03-09 21:17:46

复合文字中的“”实际上不是强制转换,而是复合文字的类型。

因此,(int){5}实际上更像是一个匿名int,因此一个有效的lvalue可以在任何可以使用相同类型的对象(在本例中是int)的地方使用。

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

阅读有关复合文字的Dr.Doobs's in-depth article

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2406933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档