表达式由运算符、常量及变量构成,C语言的表达式基本遵循一般代数规则。有几种运算法则是 C 语言表达式特有的。
2.7.1 表达式中的类型转换
同一表达式中的不同类型常量及变量在运算时需要变量为同一数据类型。C 语言的编译程序将所有操作数变换为与最大类型操作数相同的类型。如下例所示:
char c = 85; // 声明字符型变量并赋值 int i = 3; // 声明整型变量并赋值 float f = 6.382; // 声明单精度浮点型变量并赋值 double d = 2.71745, result; // 声明双精度浮点型并赋值 result = c / i + f * d - ( f + i ); // 用表达式的结果为double型变量赋值
该例中,表达式内最大的数据类型 double 成为该表达式返回值的数据类型。但并非一开始就将表达式转换成同一类型再计算,而是根据需要一步步转换,这种特性能影响计算结果。
2.7.2 构成符 cast
可以通过称为 cast 的构成符强迫表达式变为特定类型。其一般形式为:
(数据类型)表达式
“(数据类型)” 是标准 C 语言的一个数据类型。这种方式常用在较大的类型转为较小的类型,如下例所示:
int d = 5, result; // 声明整型变量并赋值 float f = 6.382; // 声明单精度浮点型变量并赋值 result = d * (int) f; // 将变量强制转换为整型再计算
此例的计算结果为 30,在运算之初已将变量 f 强制转换为整型。假若没有使用构成符,表达式 result = d * f 的结果为
31,因为变量首先被转换成单精度浮点型运算,然后赋值时再被转为整型。
2.7.3 空格 与 括号
为了增加可读性,可以随意在表达式中插入 Tab 和 空格符。例如,下面两个表达式是相同的。
result = c / i + f * d - ( f + i ); result = c / i + f * d - ( f + i );
括号可改变表达式的执行顺序,可用的括号有小括号 “()” 和 中括号 “[]”,中括号的优先级稍低。使用方法如下例所示:
result = c / [ ( i + f ) * d - ( f + i ) ];
小括号内的表达式首先被计算,然后是中括号里的表达式。冗余的括号并不导致错误或减慢表达式的执行速度,因为编译后的机器代码里已根据括号编排好了计算顺序,多余的括号被忽略。我们鼓励使用括号,它可使执行顺序更清楚一些。
2.7.4 C 语言中的简写形式
C 语言为常用赋值语句提供了简写形式。例如语句 “x = x + 5;”可以简化为 “x += 5;”。这种简化的形式适用于 C 语言的二目运算符,包括加、减、乘、除、取模。如下例所示:
c = c / ( a * b -c % b++ ); // 原表达式 c /= a * b - c % b++; // 简化后的表达式
是否对表达式简化取决于哪种方式更能直接体现出算法的实际意义,以及更容易被读懂。