一、算数运算符
算数运算符有: +? - ? * ? / ? % 五种。由于运算符有两个操作数。也被称为双目运算符
对于 / 运算符,两个操作数都是整数执行的是整数除法。至少有一个操作数是浮点时执行浮点除法
#include <stdio.h>
int main() {
int i = 5 / 2;
printf("%d\n", i);
return 0;
}
输出
2
#include <stdio.h>
int main() {
double i = 5.0 / 2;
printf("%lf\n", i);
return 0;
}
输出
2.500000
%运算符的两个操作数必须为整数,返回的是整除后的余数
#include <stdio.h>
int main() {
int i = 20 % 6;
printf("%d\n", i);
return 0;
}
对于 a / b ,运算符两个操作数有一个是负数时。如果左操作数是负数,结果为:-((-a) / b)。如果右操作数是负数,结果为:-(a / (-b))
#include <stdio.h>
int main() {
int i = -7 / 3;
int j = 5 / -2;
printf("-7 / 3 = %d\n", i);
printf("5 / -2 = %d\n", j);
return 0;
}
输出
-7 / 3 = -2
5 / -2 = -2
对于 a % b ,运算符两个操作数有一个是负数时。如果左操作数是负数,结果为:-((-a) % b)。如果右操作数是负数,结果为:a % (-b)
#include <stdio.h>
int main() {
int i = -7 % 2;
int j = 5 % -2;
printf("-7 %% 2 = %d\n", i);
printf("5 %% -2 = %d\n", j);
return 0;
}
输出
-7 % 2 = -1
5 % -2 = 1
二、移位运算符
前言:整数在内存中存储的是二进制。存储有符号整数时将二进制最高位设定为符号位,1表示负数,0表示正数。一个整数二进制表示形式有原码、反码、补码。正整数的原码、反码、补码都相同。负整数的原码、反码、补码需要计算。使用、打印整数时使用原码,计算时使用补码
int i = 10;
00000000 00000000 00000000 00001010
00000000 00000000 00000000 00001010
00000000 00000000 00000000 00001010
int j = -1
10000000 00000000 00000000 00000001
11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111111
2.1左移运算符 <<
语法: 数字 << n 对数字的补码向左边移动n位,即左边抛弃,右边补0
#include <stdio.h>
int main() {
int i = 10 << 2;
printf("%d\n", i);
return 0;
}
输出
40
#include <stdio.h>
int main() {
int i = -1 << 2;
printf("%d\n", i);
return 0;
}
输出
-4
2.2 右移运算符 >>
语法:数字 >> n 对数字的补码右移n位,即右边抛弃,左边填充 根据填充规则分为两种:逻辑移位与算数移位 逻辑移位:左边用0填充 算数移位:左边用该数字符号位填充 大部分编译器使用的是算数移位。我们演示代码的编译器也是算术移位
#include <stdio.h>
int main() {
int i = -1 >> 2;
printf("%d\n", i);
return 0;
}
输出
-1
#include <stdio.h>
int main() {
int i =10 >> 2;
printf("%d\n", i);
return 0;
}
输出
2
对于移位运算符,不要移动负数位,这个是C语言标准未定义的 如 int i = 10 >> -1 ;
三、位运算符
位运算符有:按位与 & 按位或 | 按位异或 ^ 三种
3.1 按位与 &
语法: num1 & num2 将两个数的补码计算出来,两个数对应的二进位都为1时,结果为1,否则为0
#include <stdio.h>
int main() {
int i = 10 & -3;
printf("%d\n", i);
return 0;
}
输出
8
3.2 按位或 |
语法: num1 | num2 将两个数的补码计算出来,两个数对应的二进位至少有1个为1时,结果为1,否则为0
#include <stdio.h>
int main() {
int i = -4 | -3;
printf("%d\n", i);
return 0;
}
输出
-3
3.3 按位异或 ^
语法: num1 ^ num2 将两个数的补码计算出来,两个数对应的二进位相同时,结果为0,否则为1
#include <stdio.h>
int main() {
int i = -4 ^ -3;
printf("%d\n", i);
return 0;
}
输出
1
3.4 经典笔试题
题目:有两个整数类型变量a、b,不创建临时变量交换a与b的值
方法一
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
printf("交换前 a = %d b = %d\n",a,b);
a = a + b;
b = a - b;
a = a - b;
printf("交换后 a = %d b = %d\n", a, b);
return 0;
}
输出
交换前 a = 10 b = 20
交换后 a = 20 b = 10
方法二
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
printf("交换前 a = %d b = %d\n",a,b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换前 a = %d b = %d\n", a, b);
return 0;
}
输出
交换前 a = 10 b = 20
交换前 a = 20 b = 10
四、赋值运算符 =
将赋值运算符右侧的值赋给左侧的变量
#include <stdio.h》
int main() {
int a = 20;
a = 30;
int x = 1;
int y;
int z;
z = y = x+1;
return 0;
}
复合赋值运算符: +=? -= ?*=? /= ?%= ?>>= ?<<=? &=? |= ?^=
等同于将复合赋值运算符左侧的变量与右侧的值通过运算符计算得到的结果赋值给左侧变量
#include <stdio.h>
int main(){
int i = 10;
i += 30 ;
printf("%d\n",i);
return 0;
}
输出
40
五、单目运算符
5.1 逻辑非运算符 !
在c语言中,0为假,非0为真。 逻辑非运算符逆转逻辑状态, !真 -> 假 ? !假 ->真
#include <stdio.h>
int main() {
int i = 10;
int j = 0;
printf("!i = %d\n",!i);
printf("!j = %d\n", !j);
return 0;
}
输出
!i = 0
!j = 1
#include <stdio.h>
int main() {
int i = 0;
if (!i)
printf("哈哈哈\n");
return 0;
}
输出
哈哈哈
5.2 取地址运算符 & 与 间接寻址运算符 *
&变量名 : 取出变量在内存的地址 ? * 指针变量 :访问指针变量存储的地址所对应内存空间
#include <stdio.h>
int main() {
int i = 10;
int* p = &i;
*p = 20;
printf("i = %d\n", i);
return 0;
}
输出
20
5.3 sizeof 运算符
sizeof是运算符而不是一个函数,求变量(类型)所占内存空间大小,单位为字节
#include <stdio.h>
int main() {
int i = 10;
printf("i所占空间大小为:%d\n", sizeof(i));
printf("int类型所占空间大小为:%d\n", sizeof(int));
printf("i所占空间大小为:%d\n", sizeof i);
return 0;
}
输出
i所占空间大小为:4
int类型所占空间大小为:4
i所占空间大小为:4
5.4 取反运算符 ~
取反运算符 : 对一个数的二进制位(补码)取反 。 1变0,0变1
#include <stdio.h>
int main() {
int i = ~10;
printf("%d\n", i);
return 0;
}
输出
-11
5.5 自增运算符 ++ 自减运算符- -
自增运算符分为前置++与后置++两种 前置++ 即先自增,后使用 后置++ 即先使用,后自增
#include <stdio.h>
int main() {
int i = 10;
int j = ++i;
int x = 10;
int y = x++;
printf("i = %d\n", i);
printf("j = %d\n", j);
printf("x = %d\n", x);
printf("y = %d\n", y);
return 0;
}
输出
i = 11
j = 11
x = 11
y = 10
自减运算符分为前置- -与后置- -两种 前置- - 即先自减,后使用 后置- - 即先使用,后自减
5.6 强制类型转换运算符 ( )
强制类型转换是把变量从一种类型转换为另一种数据类型 语法:(type_name) expression
#include <stdio.h>
int main() {
int i = (int)3.14;
printf("%d\n", i);
return 0;
}
输出
3
六、关系运算符
关系运算符包括: >?>=?<?<=?!=?== 注意: 赋值运算符是 = , 判断两数是否相等使用 ==
#include <stdio.h>
int main() {
int i = 10;
int j = 20;
if (i == j)
printf("相等\n");
else
printf("不相等\n");
return 0;
}
输出
不相等
七、逻辑运算符
7.1 逻辑与运算符 &&
如果&&左右两边表达式都为真,则结果为真,否则为假。当左边表达式为假,右边表达式不会进行判断执行
#include <stdio.h>
int main() {
int age = 15;
if (age > 12 && age < 18)
{
printf("青少年\n");
}
return 0;
}
输出
青少年
#include <stdio.h>
int main() {
int i = 0;
int j = 1;
int c = i++ && j++;
printf("i = %d j = %d c = %d\n",i,j,c);
return 0;
}
输出
i = 1 j = 1 c = 0
7.2 逻辑或运算符 ||
如果||左右两边表达式至少有一个为真,则结果为真,否则为假。当左边表达式为真,右边表达式不会进行判断执行
#include <stdio.h>
int main() {
int weight = 80;
if(weight < 90 || weight > 130)
{
printf("体重不健康\n");
}
return 0;
}
输出
体重不健康
#include <stdio.h>
int main() {
int i = 1;
int j = 2;
int z = i++ || j++;
printf("i = %d j = %d z = %d\n", i, j, z);
return 0;
}
输出
i = 2 j = 2 z = 1
八、条件运算符(三目运算符)
语法: 条件 ? X : Y 当条件为真时,值为X,否则为Y
#include <stdio.h>
int main() {
int x = 10;
int y = 20;
int max = x > y ? x : y;
printf("x与y的较大值为:%d\n", max);
return 0;
}
输出
x与y的较大值为:20
九、逗号运算符
逗号运算符:从左向右依次执行。整个表达式的结果是最后一个表达式的结果 语法: (exp1, exp2, exp3, …expN)
#include <stdio.h>
int main() {
int i = 10;
int x = (10, i++,30);
printf("%d\n",i);
printf("%d\n", x);
return 0;
}
输出
11
30
十、下标引用运算符 [ ] 与 函数调用运算符 ( )
10.1 下标引用运算符 [ ]
需要引用数组某个元素时: 数组名[下标] 数组下标从0开始,所以数组最后一个元素下标为数组大小-1 下标引用运算符 [ ] 有两个操作数,一个是数组名,一个是下标
#include <stdio.h>
int main() {
int arr[5] = { 1,2,3,4,5 };
printf("%d\n", arr[3]);
printf("%d\n", 3[arr]);
return 0;
}
输出
4
4
10.2 函数调用运算符 ( )
语法: 函数名(参数) 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
#include <stdio.h>
void print1() {
printf("哈哈哈\n");
}
void print2(char* p) {
printf("%s\n",p);
}
int main() {
print1();
print2("hello");
return 0;
}
输出
哈哈哈
hello
十一、引用结构体(联合体)成员运算符
引用结构体(联合体)成员运算符有两个,一个是点运算符 . ? 一个是箭头运算符 -> 语法: 结构体变量.成员名 结构体指针变量->成员名
#include <stdio.h>
struct person {
char name[10];
int age;
char sex[5];
};
void print1(struct person p) {
printf("姓名:%s 年龄:%d 性别:%s\n", p.name, p.age, p.sex);
}
void print2(struct person* p) {
printf("姓名:%s 年龄:%d 性别:%s\n", p->name, p->age, p->sex);
}
int main() {
struct person p = { "康小龙",18,"男" };
print1(p);
print2(&p);
return 0;
}
输出
姓名:康小龙 年龄:18 性别:男
姓名:康小龙 年龄:18 性别:男
|