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. 算术运算符的应用
#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;
}
结果:
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. 自增自减运算符的应用
#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;
}
结果:
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. 赋值运算符
#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;
}
结果
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 用于数据类型
sizeof使用形式: sizeof(type)
数据类型必须用括号括住: sizeof(int)
4.1.2 用于变量
sizeof使用形式: sizeof(var_name) 或 sizeof var_name
变量名可以不用括号括住. 如sizeof (var_name),sizeof var_name 等都是正确形式,带括号的用法更普遍,大多数程序员采用这种形式。
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,
4.1.3 sizeof的结果 (不同的平台上可能不一样)
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)。