由变量、常量和函数调用按C语言语法规则用运算符连接起来的式子称为表达式。
凡是合法的表达式都有一个值,即运算结果。
单个的常量、变量、函数调用也可以看作是表达式的特例。
表达式的求值按运算符的优先级和结合性规定的顺序进行。
基本运算符是:+(加)、-(减)、*(乘)、/(除)、%(求余)。
这些运算符需要有两个运算对象,称为双目运算符。
其中运算符“+”、“-”也可用作取正和取负的单目运算符使用。
求余运算符“%”的运算结果是两数相除所得的余数,运算符的左侧为被除数,右侧是除数。求余运算符的运算对象只能是整型量
注意:
自增运算符的功能是使变量的值自增1。
自减运算符的功能是使变量的值自减1。
自增、自减运算符只需要一个运算对象,称为单目运算符。
自增、自减运算符构成的表达式有两种形式,前缀形式:++i和–i,后缀形式:i++和i–。
#include
int main() {int i;printf("请输入一个值:");scanf_s("%d", &i);printf("%d\n", ++i);printf("%d\n", --i);printf("%d\n", i++);printf("%d\n", i--);printf("%d\n", -i++);printf("%d\n", -i--);return 0;
}
结果:
对以上结果分析:
printf("%d\n", ++i);
,因为是++i,所以i的值先加1然后再参与运算即输出,所以输出的结果为9,这时i的值为9;printf("%d\n", --i);
,因为是–i,所以i的值先减1然后再参与运算即输出,所以输出的结果为8,这时i的值为8;printf("%d\n", i++);
,因为是i++,所以先参与运算即输出i的值,然后i的值再加1,所以输出的结果为8,这时i的值为9;printf("%d\n", i--);
,因为是i–,所以先参与运算即输出i的值,然后i的值再减1,所以输出的结果为9,这时i的值为8;printf("%d\n", -i++);
,因为是i++,所以先参与运算即输出-i的值,然后i的值再加1,所以输出的结果为-8,这时i的值为9;printf("%d\n", -i--);
,因为是i–,所以先参与运算即输出-i的值,然后i的值再减1,所以输出的结果为-9,这时i的值为8;由算术运算符和括号将运算对象(常量、变量、函数等)连接起来的式子,称为算术表达式。
例:
x+y+z
(f1*2.0)/f2+5.0
++i
在C语言表达式中,所有的运算符号都是不能省略的。
简单赋值运算符为 =
。其一般形式为:
变量 = 表达式
赋值表达式的功能是:将赋值运算符右边表达式的值赋给赋值运算符左边的变量。
例:
c = a + b
a = b = c = 0
x = (a = 4) + (b = 5)
赋值表达式有类型转换的问题。当赋值运算符两边的数据类型不同时,系统会进行自动类型转换,把赋值符右边的类型转换为左边的类型。
赋值表达式的转换规则:
#include
int main() {int x1 = 66, x2, x3;float f1 = 6.66, f2;char c1 = 'A', c2;x2 = f1; //实型赋给整型f2 = x1; //整型赋给实型x3 = c1; //字符型赋给整型c2 = x1; //整型赋给字符型printf("%d\n", x2);printf("%f\n", f2);printf("%d\n", x3);printf("%c\n", c2);return 0;
}
结果:
复合赋值运算符是在简单赋值运算符 =
前加其他双目运算符构成的。由复合赋值运算符连接的式子称为(复合)赋值表达式,一般形式为:
变量复合赋值运算符表达式
例如:
a+=5等价于a = a + 5
x * = y+7等价于x = x * (y + 7)
r % = p 等价于r = r % p
#include
int main() {int a = 10, b = 12, c = 13;a += 1;b *= 10;c %= 5;printf("%d\n", a);printf("%d\n", b);printf("%d\n", c);return 0;
}
结果:
用逗号运算符连接起来的式子,称为逗号表达式。逗号表达式的一般形式为:
表达式1,表达式2,.......,表达式n
逗号表达式的求值过程是:先求表达式1的值,再求表达式2的值,依次下去,最后求表达式n的值,表达式n的值即作为整个逗号表达式的值。
#include
int main() {int a = 2, b = 4, c = 6, x, y;y = ((x = a + b), (b + c)); //逗号运算符printf("y = %d\nx = %d\n", y, x);return 0;
}
结果:
分析:
可以看出:y等于整个逗号表达式的值,也就是逗号表达式2的值(b + c),x是表达式1的值。
说明:
自动类型转换是当参与同一表达式中的运算量具有不同类型时,编译系统自动将它们转换成同一类型,然后再按同类型量进行运算的类型转换方式。
自动转换的规则:当两个运算量类型不一致时,先将低级类型的运算量向高级类型的运算量进行类型转换,然后再按同类型的量进行运算。
说明:
如:float与int运算时,先将float转换成double、int转换成double,然后再进行运算。
强制类型转换的一般格式:
(数据类型说明符)表达式
功能:把表达式的运算结果强制转换成类型说明符所表示的类型。
强制类型转换主要用在两个方面:
#include
int main() {int n = 66;float f = 8.88;printf("%f\n", n + f); //都转换成double型进行运算printf("%f\n", (float)n); printf("%d\n", (int)f);return 0;
}
结果: