改善C++ 程序的150个建议学习之建议6:明晰逗号分隔表达式的奇怪之处
2013-09-09 14:19
295 查看
建议6:明晰逗号分隔表达式的奇怪之处
逗号分隔的表达式是从C继承而来的。它用一种特殊的运算符—逗号运算符将多个表达式连接起来。逗号表达式的一般形式为:
表达式1,表达式2,表达式3......表达式n 需要注意的是,整个逗号分隔表达式的值为表达式n的值。在使用for-循环和while-循环时,经常会使用这样的表达式。然而,由于语言规则不直观,因此理解这样的语句存在一定的困难。例如:
if(++x, --y, x<20 && y>0) /*三个表达式*/
if条件包含由逗号分隔的三个表达式。C++确保每个表达式都会被执行,并产生作用。不过,整个表达式的值仅是最右边表达式的结果。因此,只有当x小于20且y大于0时才会返回true,上述条件也才会为真。再举一个逗号表达式的例子:
int j=10;
int i=0;
while( ++i, --j)
{
/*只要j不为0就会循环执行*/
}
其实,逗号表达式无非是把若干个表达式"串联"起来。在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值。当然并不是所有地方出现的逗号都是逗号运算符,例如用逗号分隔的函数参数:
printf("%d - %s - %f", count, str, PI);
“count, str, PI”并非逗号分隔表达式,而是printf的三个输入参数。另外一个需要注意的问题就是,在C++中,逗号分隔表达式既可以用作左值,又可以用
作右值。
请记住:逗号分隔的表达式由于语言规则的不直观,容易产生理解上的误差。在使用逗号分隔表达式时,C++会确保每个表达式都被执行,而整个表达式的值则是最右边表达式的结果。
逗号分隔的表达式是从C继承而来的。它用一种特殊的运算符—逗号运算符将多个表达式连接起来。逗号表达式的一般形式为:
表达式1,表达式2,表达式3......表达式n 需要注意的是,整个逗号分隔表达式的值为表达式n的值。在使用for-循环和while-循环时,经常会使用这样的表达式。然而,由于语言规则不直观,因此理解这样的语句存在一定的困难。例如:
if(++x, --y, x<20 && y>0) /*三个表达式*/
if条件包含由逗号分隔的三个表达式。C++确保每个表达式都会被执行,并产生作用。不过,整个表达式的值仅是最右边表达式的结果。因此,只有当x小于20且y大于0时才会返回true,上述条件也才会为真。再举一个逗号表达式的例子:
int j=10;
int i=0;
while( ++i, --j)
{
/*只要j不为0就会循环执行*/
}
其实,逗号表达式无非是把若干个表达式"串联"起来。在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值。当然并不是所有地方出现的逗号都是逗号运算符,例如用逗号分隔的函数参数:
printf("%d - %s - %f", count, str, PI);
“count, str, PI”并非逗号分隔表达式,而是printf的三个输入参数。另外一个需要注意的问题就是,在C++中,逗号分隔表达式既可以用作左值,又可以用
作右值。
请记住:逗号分隔的表达式由于语言规则的不直观,容易产生理解上的误差。在使用逗号分隔表达式时,C++会确保每个表达式都被执行,而整个表达式的值则是最右边表达式的结果。
相关文章推荐
- 改善C++ 程序的150个建议学习之建议3:对表达式计算顺序不要想当然
- 改善C++ 程序的150个建议学习之建议13:掌握变量定义的位置与时机
- 改善C++ 程序的150个建议学习之建议20:使用memcpy()系列函数时要足够小心
- 改善C++ 程序的150个建议学习之建议14:小心typedef使用中的陷阱
- 改善C++ 程序的150个建议学习之建议20:使用memcpy()系列函数时要足够小心
- 改善C++ 程序的150个建议学习之建议22:灵活地使用不同风格的注释
- 改善C++ 程序的150个建议学习之建议26:用引用代替指针
- 改善C++ 程序的150个建议学习之建议33:小心翼翼地重载operator new/ operator delete
- 改善C++ 程序的150个建议学习之建议21:尽量用new/delete代替malloc/free
- 改善C++ 程序的150个建议学习之建议34:用智能指针管理通过new创建的对象
- 改善C++ 程序的150个建议学习之建议0:不要让main函数返回void
- 改善C++ 程序的150个建议学习之建议4:小心宏#define使用中的陷阱
- 改善C++ 程序的150个建议学习之建议23:尽量使用C++标准的iostream
- 改善C++ 程序的150个建议学习之建议35:使用内存池技术提高内存申请效率与性能
- 改善C++ 程序的150个建议学习之建议7:时刻提防内存溢出
- 改善C++ 程序的150个建议学习之建议27:区分内存分配的方式
- 改善C++ 程序的150个建议学习之建议1:区分0的4种面孔
- 改善C++ 程序的150个建议学习之建议15:尽量不要使用可变参数
- 改善C++ 程序的150个建议学习之建议24:尽量采用C++风格的强制转型
- 改善C++ 程序的150个建议学习之建议5:不要忘记指针变量的初始化