C 语言支持一组丰富的内置运算符。运算符(Opertors) 是一个符号,它告诉编译器根据提供给运算符的值执行某些数学,条件或逻辑运算。
操作数(operand)是任何运算符都可以使用的值。例如,当我们说 4+5 时,这里的数字 4 和 5 是操作数,而 + 是运算符。
不同的运算符使用不同数量的操作数,例如 + 运算符需要两个操作数(5+6),称为双目运算符; 自增符号“++” 只需要一个操作数(a++), 称为单目运算符;而需要三个操作数的运算符,称为三目运算符,例如条件运算符(?:)。
1.C语言运算符种类
C语言有六种运算符,如下:
1)算术运算符;
2)赋值运算符;
3)关系运算符;
4)逻辑运算符;
5)位运算符;
6)条件运算符(?:);
6) 杂项运算符。
下面的表格列出了 C 语言支持的所有杂项运算符:
解释 |
例子 |
|
---|---|---|
sizeof() |
返回变量的字节大小 |
sizeof(int)将返回4 |
& |
返回变量的地址 |
&a; 将给出变量的实际地址 |
* |
指向一个变量 |
*a; 将指向一个变量 |
. |
操作结构联盟里面的成员 |
mem.age |
-> |
操作结构联盟里面的指针成员 |
mem->age |
[] |
数组元素的下标 |
arr[0] |
本章将只介绍算术运算符、赋值运算符和sizeof运算符,关系运算符,逻辑运算符, 位运算符,和杂项运算符放在其它章节中介绍。
2.算术运算符
下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 18,变量 B 的值为 5,则:
运算符 | 描述 | 实例 |
+ | 两个数相加 | A+B 将得到 23 |
– | 一个数减另一个数 | A-B 将得到 13 |
* | 两个数相乘 | A*B 将得到 90 |
/ | 分子除以分母 | A/B 将得到 3.6 |
% | 余数运算符,整除后的余数 | B%A 将得到 3 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 19 |
— | 自减运算符,整数值减少 1 | A– 将得到 17 |
例1. 算术运算符的应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> int main() { int A=18; // 定义变量A,赋值18 int B=5; // 定义变量B,赋值5 printf("A=%d\n", A); printf("B=%d\n",B); printf("A+B=%d\n",A+B); printf("A-B=%d\n",A-B); printf("A*B=%d\n",A*B); printf("A/B=%d\n",A/B); int C = A % B ; printf("A Remainder B=%d\n",C); A++; // 自增1 printf("A++=%d\n",A); B--; // 自减1 printf("B--=%d\n",B); return 0; } |
结果:
1 2 3 4 5 6 7 8 9 10 11 12 |
A=18 B=5 A+B=23 A-B=13 A*B=90 A/B=3 A Reminder B=3 A++=19 B--=4 Process returned 0 (0x0) execution time : 0.039 s Press any key to continue. |
变量的自增或自减有两种写法:
变量名++; // 表示在本次使用变量后再自增;
++变量名; // 表示在本次使用变量前自增;
变量名–; // 表示在本次使用变量后再自减;
—变量名; // 表示在本次使用变量前自减;
例2. 自增自减运算符的应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <stdio.h> int main() { int ii; // 定义变量ii并初始化 ii=10; printf("ii=%d\n",ii); printf("ii++=%d\n",ii++); // 在使用后自增 printf("ii=%d\n\n",ii); ii=10; printf("ii=%d\n",ii); printf("++ii=%d\n",++ii); // 在使用前自增 printf("ii=%d\n\n",ii); ii=10; printf("ii=%d\n",ii); printf("--ii=%d\n",--ii); // 在使用前自减 printf("ii=%d\n\n",ii); ii=10; printf("ii=%d\n",ii); printf("ii--=%d\n",--ii); // 在使用前自减 printf("ii=%d\n\n",ii); return 0; } |
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
ii=10 ii++=10 ii=11 ii=10 ++ii=11 ii=11 ii=10 --ii=9 ii=9 ii=10 ii--=9 ii=9 Process returned 0 (0x0) execution time : 0.957 s Press any key to continue. |
3. 赋值运算符
下表列出了 C 语言支持的赋值运算符:A的值是5,B的值是6,C的值是9
运算符 | 描述 | 实例 |
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | D = A + B 将把 A + B 的值赋给 D D=11 |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A; C=14 |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C – A;C=4 |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A; C=45 |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A; C=1 |
%= | 求余数且赋值运算符,求两个操作数的模赋值给左边操作数,浮点数不适用取余数。 | C %= A 相当于 C = C % A; C=4 |
赋值运算符支持的是C语言的基本数据类型,包括char、int和double,字符串(字符数组)不能使用赋值运算符。
例3. 赋值运算符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <stdio.h> int main() { int C=0; // 定义变量C并初始化 int A=21; // 定义变量A并初始化 printf("C=0; A=21\n"); C=A; printf("C=A; C=%d\n",C); C+=A; // C=C+A; printf("C+=A,C=%d\n",C); C-=A; // C=C-A; printf("C-=A,C=%d\n",C); C*=A; // C=C*A; printf("C*=A,C=%d\n",C); C/=A; // C=C/A; printf("C/=A,C=%d\n",C); C=200; printf("C=200\n"); C%=A; // C=C%A; printf("C%=A,C=%d\n",C); return 0; } |
结果
1 2 3 4 5 6 7 8 9 10 11 |
C=0; A=21 C=A; C=21 C+=A,C=42 C-=A,C=21 C*=A,C=441 C/=A,C=21 C=200 C=A,C=11 Process returned 0 (0x0) execution time : 1.185 s Press any key to continue. |
4. sizeof 运算符
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等,它并不是函数。
sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。
4.1 sizeof 的使用方法
4.1.1 用于数据类型
1 2 |
sizeof使用形式: sizeof(type) 数据类型必须用括号括住: sizeof(int) |
4.1.2 用于变量
1 |
sizeof使用形式: sizeof(var_name) 或 sizeof var_name |
变量名可以不用括号括住. 如sizeof (var_name),sizeof var_name 等都是正确形式,带括号的用法更普遍,大多数程序员采用这种形式。
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,
4.1.3 sizeof的结果 (不同的平台上可能不一样)
1 2 3 4 5 6 7 8 9 10 11 12 |
sizeof(char) = 1; sizeof(unsigned char) = 1; sizeof(signed char) = 1; sizeof(int) = 4; sizeof(unsigned int) = 4; sizeof(short int) = 2; sizeof(unsigned short) = 2; sizeof(long int) = 4; sizeof(unsigned long) = 4; sizeof(float) = 4; sizeof(double) = 8; sizeof(long double) = 12; |
int 型与 float 型混合在一起时,运算结果是 float 型。
比如,9 + 2.5f 的值为 11.5;6.7f / 2 的值为 3.35。
运算符 /:当两个操作数都是整型时,结果会向下取整。如,1 / 2 的值是 0,而不是 0.5 。
运算符 %要求两个操作数都是整型。
把 0 作为 / 或 % 的右操作数会导致未定义行为。
当运算符 / 和 % 用于负操作数时,其结果难以确定。
根据 C89 的标准,如果两个操作数中有一个是负数,那么除法结果既可以向上取整也可以向下取整(例如,-9 / 7 的结果既可以是 -1 也可以是 -2);i % j 的符号与具体实现有关(例如,-9 % 7 可以是 -2 也可以是 5)。
在 C99 中,除法的结果总是向零取整(因此,-9 / 7 的结果是 -1);i % j 的符号与 i 相同(因此,-9 % 7 的结果是 -2;我特意测试了以下,9 % -7 的值是 2,-9 % -7 的值还是 2)。