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) );
// 这就是所谓的语法了。不过这也挺符合程序员的想法的。
}