算术操作符
算术运算符: + - * / %
算术运算符在是使用中较为简单常见,但是在使用的过程中需要注意以下几点:
1、%操作符只能操作整数,而其他运算符既能用于整数也可用于浮点数。
2、%操作符操作数必须是整数。其返回整除之后的余数。
3、对于/运算符,如果操作数数整数则执行整数除法,如果操作数是浮点数则执行浮点数除法。
移位操作符
<< 左移操作符
逻辑左移/算术左移:左边抛弃,右边补0;
>> 右移操作符
逻辑右移:左边补0,右边丢弃;
算术右移:左边用原值符号位补,右边丢弃;
左移:
右移:
移位运算符在使用时也需要注意以下几点:
1、C语言中移位操作符实现的是逻辑左移和算术右移,但是算术左移和逻辑左移的效果相同,算术右移和逻辑右移的效果不同,要实现逻辑右移可将操作数强制类型转化为无符号数
2、移位操作符只可用来处理整数(int)类型.
3、像char、byte、short等按位操作时,会转换成int之后操作,只有右端5位有效,因为int类型值只有32位,2的5次方等于32。long操作后结果仍然为long,但只有右端低6位有效。因为long类型值只有64位,2的6次方等于64。
4、对于移位运算符,请不要操作移动负数位,因为标准未定义,后果未知
位操作符
& : 按位与 1&1=1,1&0=0,0&0=0
| : 按位或 1|0=1,1|1=1,0|0=0
^ : 按位异或 1^1=0,1^0=1,0^0=1
注意:位操作符的操作数必须是整数
一般按位与异或,比较容易考察。下面有一道题:
//不能创建临时变量(第三个变量),实现两个数的交换
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n",a,b);
return 0;
}
//求一个整数存储在内存中的二进制中1的个数。
#include<stdio.h>
int main()
{
int num = 10;
int count = 0;
for(int i = 0; i < 32; i++){
if(((num>>1)&1)==1)
count++;
}
printf("二进制中1的个数:%d\n",count);
return 0;
}
赋值操作符
=: 赋值操作,连续赋值
符合赋值符:+=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=
int a = 10;
a = 20;//赋值操作
int x,y=0;
x=y=a;//连续赋值
int x = 10;
x = x + 10;
x += 10;//复合赋值
单目操作符
!:逻辑反操作
-:负值
+:正值
&:取地址
sizeof:操作数的类型长度
~:对一个数的二进制按位取反
--:前置、后置--
++:前置、后置++
*:间接访问操作符(解引用操作符)
(类型):强制类型转换
//部分单目操作符使用
void test()
{
int a = -10;
int *p = NULL;
printf("%d\n", !2);//输出0
printf("%d\n", !0);//输出1
a = -a;
p = &a;
printf("%d\n", sizeof(a));//输出4
printf("%d\n", sizeof(int));//输出4
printf("%d\n", sizeof a);//输出4
}
//sizeof与数组之间的关系
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)输出4
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)输出4
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//(1)输出40
printf("%d\n", sizeof(ch));//(3)输出10
test1(arr);
test2(ch);
return 0;
}
//注意:在前面讲数组已经提到单目操作符sizeof计算操作数类型所占空间大小的,但是在数组这里却存在例外:
//当传入数组名时计算得到确是整个数组所占空间的大小就像(1)(3)。但是你可能回问为什么(2)(4)
//输出为4呢?,那是因为当我们将数组作为参数传给函数时,其实就相当于传的是数组的第一个元素的地址
//也就是数组的首地址是一个指针类型的形参,在函数内面通过sizeof计算其实就相当于计算该指针类型
//形参所占空间大小,而在32位向下指针大小统一为4字节,所以都输出4。
//++和--运算符
void test()
{
//前置++和--
int a = 10;
//前置++,现进行自增,然后再使用
int x1 = ++a;//x1=11,a=11
//前置--,现进行自减,然后在使用
int y1 = --a;//y1=10,a=10
//后置++和--
int b = 10;
//后置++,现使用,在进行自增
int x2 = a++;//x2=10,b=11;
//后置--,先使用,在进行自减
int y2 = a--;//y2 = 11,b=10
}
关系操作符
> :大于
>=:大于等于
< :小于
<=:小于等于
!=:判断测试 不等于
==:判断测试 等于
关系操作符都比较简单,但是在使用时要注意不要写错,例如:== 和 = 就有很大的差别呢!!!
逻辑操作符
&&: 逻辑与
||: 逻辑或
这里逻辑操作符和位操作符很容易混淆:
//逻辑操作
1&&2 = 1
1||2 = 1
//位操作
1&2 = 0
1|2 = 3
void test()
{
int i = 0,a = 0,b = 2,c = 3,d = 4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
//输出:a = 1, b = 2 ,c = 3,d = 4;
}
因为有这样的输出是因为:
1) && (逻辑与):(三种)
① 当逻辑与左边为false(假),则不再进行逻辑与右边的判断,结果为false(假)
② 当逻辑与左边为true(真)则进行右边判断,右边为false(假),结果为false(假)
③ 当逻辑与左边为true(真)则进行右边判断,右边也为true(真),则结果为true(真)
2) || (逻辑或):(三种)
① 当逻辑或左边为false(假),继续逻辑或右边的判断,如果也为false(假),结果为false(假)
② 当逻辑或左边为false(假),继续逻辑或右边的判断,如果为true(真),结果为true(真)
③ 当逻辑或左边为true(真),则不再进行逻辑或右边的判断,结果为true(真)
正式由于上面的原因,因为是后置++所以先使用a判断,此时a=0;左边为false,变不在判断结果为假了,所以后面的b,c,d都没有变化。
注意:&&:全true才true,||:全false才false。
条件表达式(三目运算符)
exp1 ? exp2 : exp3
合理的运用三目运算符和以示代码简洁,
//普通写法
if(a > 5)
b = 3;
else
b = -3;
//三目运算符写法
a > 5 ? b = 3 : b=-3;
以上便是对C语言的操作符进行介绍,如有错误请不吝赐教…