码迷,mamicode.com
首页 > 编程语言 > 详细

C、C++差异之左值右值

时间:2015-02-12 02:07:29      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:c++   语法   c   差异   

C与C++在语法细节上还是有一些差异的,虽然一般情况下可能这些差异不足以造成结果的区别,但有些代码确实会有影响。


这次,主要总结下左值右值的差异。

在C中,很多左值运算符的结果都不再是左值,然而在C++中,只要逻辑上可行,左值运算符的结果仍然是左值。C++的这种方式,让运算符表达式之间的灵活性更大。


1、++i, 我们都习惯了在C++中,i 自加后返回自己;然而在C中i自加后,返回的是个临时的副本,即和i++是一样的,此结果不能作为左值,即(++i)=0非法。所以我想这就是为什么代码 中还是很多for循环中使用着i++,因为在C中,我认为i++与++i的效率是一样的。

2、=,同样的,C中结果是右值,即 (a = b) = c在C中是不合法的,然而在C++中是可以的。

3、?:,C中返回的分支结果是右值,在C++中规定是,只要两分支都是左值且类型相同,结果亦为左值(参见,C++程序设计语言-特别版 第6.2节)。即如下:

{   
   (1 ? i=11 : j)=22; // C++结果是i = 22,在C中非法
   printf("%d %d \n", i, j);
   
   1 ? i=11 : j=22; // C++结果却是i = 11,在C中非法,正确写法为: 1 ? i=11 : (j=22);
   printf("%d %d \n", i, j);
   // 本以为结果和上面相同,因为 ?:的优先级高于 =,按理说应该等价于上面的表达式
   // 然而这就是现实,事物永远不会按着你的想法来。
   // C++中的语法规则决定 等价于:
   // (1) ? (i=11) : (j=22);
   // 再同样参见C++程序设计语言-特别版 第6.2节,这样奇葩的表达式:
   // a = b < c ? d = e : f = g; 等价于:
   // a = ( (b < c) ? (d = e) : (f = g) );
   // 这就是所谓的语法了。不过这也挺符合程序员的想法的。
}





本文出自 “v” 博客,请务必保留此出处http://4651077.blog.51cto.com/4641077/1613799

C、C++差异之左值右值

标签:c++   语法   c   差异   

原文地址:http://4651077.blog.51cto.com/4641077/1613799

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!