C语言常用操作1
一,算数运算符(这里只重点写“/”和“%”)
1.“/”除法操作符
如果两个操作数都是整数,执行整数除法,如果两个数有一个是小数执行浮点数除法(double类型),执行浮点数除法。(两种除法除数都不能为0)
#include<stdio.h>
//操作符
// "/"除法 除号两端都是整数则执行的时整数除法 如果两端有一个是小数则执行浮点数除法 除数都不能为0
int main() {
int r = 7 / 2;
printf("%d\n", r);//3
double n = 7 / 2;
printf("%lf", n);//3.000000 必须有一个数是小数,用double接收打印才会是浮点数
double d = 7.0 / 2;
printf("%lf", d);//3.500000
return 0;
}
2.“%”取余操作符
% 操作符的两个操作数必须为整数。返回的是整除之后的余数。
int main() {
int r = 17 % 8;
printf("%d\n", r);//1
int d = 123 % 10;
printf("%d\n", d);//3
int s = 123 / 10;
printf("%d\n", s);//12
int n = 123 / 10 % 10;
printf("%d\n", n);//2
int y = 123 / 100;
printf("%d", y);//1
return 0;
}
二、移位操作符
移动的是整数在内存中的补码,只有整数才能位移,位移量只能是正数,
整数在内存中是以补码的形式储存的,计算也是通过补码,但我们在计算的时候是要用原码的。
二进制的正\负数是由码开头的0\1表示的
正数的原、反、补码都是一样的
如:
负数的反码是把原码的1换成0,0换成1,补码=反码+1(注意开头一位是符号位不变)
如:
1.“>>”右移操作符
右移操作符在C语言中是“算数移动”——右边丢弃,左边补符号位
2.“<<”左移操作符
左边丢弃右边补0
注:对于移位运算符,不要移动负数位,这个是标准未定义的。
三、位操作符
(操作的也是二进制补码(整数))
1.“&” 按位异
对应补码,有0为0,两个同时为1才为1
a=3 补码:0000000000000011
b=-5 补码:111111111111111011
a&b 补码:0000000000000011 ==>3
应用:编写一个代码,求一个整数储存在内存中的1的个数
2."|"按位或
有1为1,同为0才为0
a=3 补码:0000000000000011
b=-5 补码:111111111111111011
a|b 补码:111111111111111011 (负数的补码)==>(反码):111111111111111010–>(原码): 1000000000000101
所以a|b=-5
应用:把13的二进制中的低5位改为1
3."^"按位异或
相同为0相异为1
a=3 补码:0000000000000011
b=-5 补码:111111111111111011
a^b 补码:111111111111111000–>反码:111111111111110111–>原码:1000000000001000
所以a^b=-8
"^“”的应用:,要求不能建立第三个变量来实现交换两个整数
四.赋值及复合赋值操作符号
1.赋值操作符"="
2.复合赋值操作符
+=
-= *= /= %= >>= <<= &= |= ^=
五、单目操作符介绍(只有一个操作数)
! 逻辑非
+正值
-负值
&取地址
*解引用操作符(间接访问操作符)
int main() {
int a = 10;
//pa是指针变量
int* pa = &a;//取地址操作符,取出a的地址
*pa = 20;//*pa 为解引用操作符(间接访问操作符)-单目操作符-通过中存放的地址,指到相应的空间内容
}
sizeof 求操作数类型的长度(以字节为单位)
如:
int main() {
int a = 0;
printf("%d\n", sizeof(int));//4 int 类型4个字节
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof a);//4
int arr[10] = { 0 };
printf("%d\n", sizeof(int [10]));//40 int [10]类型40个字节
printf("%d\n", sizeof(arr));//40
return 0;
}
void test1(int arr[]) {//int*
printf("%d\n", sizeof(arr));//4 因为是在x86状态
}
void test2(char ch[]) {//char*
printf("%d\n", sizeof(ch));//4
}
int main() {
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));//40
printf("%d\n", sizeof(ch));//10
test1(arr);//传过去的是arr[0]的地址
test2(ch);//传过去的是arr[0]的地址
return 0;
}
~ 按位取反(按照补码二进制取反)
a=0
~a
补码:00000000000000000
取反:1111111111111111111(负数的补码)—>反码:1111111111111111110–>原码:10000000000000001
=-1
应用:把000000000000000011101的第5位的1换成0
拓展:我们有这样的输入判断语句
++ – 加加 减减
后置++(先使用再++把值赋给原来的数)
int main() {
int a = 3;
int b = a++; //后置++。先使用 后++
//b=a;a=a+1
printf("a=%d b=%d",a, b);//a=4 b=3
return 0;
}
前之++,先++,再使用
int main() {
int a = 3;
int b = ++a; //先++。再使用
//a=a+1;b=a;
printf("a=%d b=%d", a, b);//a=4 b=4
return 0;
}
"–"同理。
(类型) 强制转换类型
int main() {
int a = (int)3.14;//把3.14强制转换成int类型,编译器就不会报错
printf("%d", a);//3
return 0;
}
六、条件操作符
只能应用到合适的类型上(不能比较自己定义的一些东西)比如自己定义的字符串
=
<
<=
!= 用于测试相等
== 用于测试”相等“