语法糖可以提供方便,让程序员少写几行代码,让代码看起来简洁。不过有时语法糖不如多个语句组合灵活。
for循环
维基百科“语法糖”收录了这条,简单的说下面两个语句意思完全一样
while(i<n)
{
do();
++i;
}
for(;i<n;++i)
{
do();
}
这里for循环的优点是能防止自增语句忘了写,do长一点的话往往被忽略。不过有些情况for循环难以胜任,比如下面
while(iter!=list.end)
{
if(cond(iter))
iter=list.delete(iter); //删除list中符合条件的元素
else
++iter;
}
C语言的for语句并没有多大优势(如果看C99之前的不能在循环里面定义循环变量,优势就更小了),甚至连for这个单词的意思都体现不出来。有的语言有foreach、for[1...n]之类的写法就强大多了。
后置++ --
我想把自增自减都算上,不过这玩意用的挺多的,汇编语言也有自增操作可以对应起来,姑且把前置自增留下把。自增运算如果不是一个单独的语句,理解的时候还是要在脑中把语句分成使用和自增两部分,不如写两个语句直观。后置自增都可以用前置自增代替,就是多写一行而已。
使用自增优点是大大减少代码量,当然缺点是大大降低代码可读性,以及增加一些未定义行为之类乱七八糟的概念折磨初学者和考生。我的意见是自增只用来单独的一句,不掺和其他代码。
//减少代码量的例子
while((*des++ = *src++) != 0);
//可以用下面的代替
while((*des = *src) != 0)
{
++des;
++src;
}
//这个代码就没办法缩成一行,把自增放到上面会有未定义行为
while(des[i] = src[i])
++i;
复合赋值运算符
诸如+= -= *= /= >>= <<= .......由于历史原因,这些玩意唯一的作用就是少写代码,缺点就是让人多背写运算符优先级(虽然优先级是一组的不过看着也乱)。这些都可以用两个运算符代替。简单的写法,比如遍历偶数写个i+=2还是可以的。复杂的话只用=号。
连等
a=b=c这样的写法(和a=c;b=c等价)。为了满足这种写法,C语言的赋值表达式可以返回右值。当然这一条带来的负面效应恐怕远远大于少写代码的好处,导致出现了if(NULL==p)这样的畸形写法。如果说赋值返回右值有情可原的话,C++中赋值返回左值就是笑话了:(a=b)=c这句话有什么意义?有什么实用价值?