初识c语言3——9.算数操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式。
(1)算数运算符
+ - * /(%)
加、减、乘和数学运算一样,在除这方面就有所不同,(/)运算符在进行运算时取的是运算之后的整数,而(%)运算符在进行运算时取的是运算之后的余数
Eg:
题目:将一个n位数,反向输出
#include <stdio.h>
int main()
{
int r=0;
scanf("%d",&r);
while(r) //当r为0时,循环结束
{
printf("%d",n%10); /*进行%10取余的方法依次打印末尾的单个数值,注意进行运算时,n本身的值未发生改变 */
n=n/10; //将n进行/10取整赋给n,使n下一次能够打印所需值
}
return 0;
}
(2)移位操作符
右移运算符>> 左移运算符<<
在二进制的基础上进行对数字进行平移
Eg:
3的二进制数为:00000011
3>>1 //把3的二进制位向右移动一位,右边最低位舍去,左边最高位补0,得到00000001
3<<1 //把3的二进制位向左移动一位,左边最高位舍去,右边最高位补0,得到00000110
Eg:
#include <sttdio.h>
int main()
{
int r=3;
int n=0;
int n=r>>1; //n=1
int n=r<<1; /*位运算符不会改变原变量的值,要改变原变量的值需要进行赋值表达式实现,所以n=6
printf("%d',n); //打印6
return 0;
}
(3)位操作符
按位与(&)、按位或(|)、按位异或(^)
功能:对两个二进制数进行运算
&:对应的两个二进制位都为1则取1,其他可能都取0
|:对应的两个二进制位都为0则取0,其他可能都取1
^:对应的两个二进制位相同则取0,其他可能都取1
#include <stdio.h>
int main()
{
int r=3; // r:00000011
int n=2; // n:00000010
int w=0;
w=r&n;
printf("%d",w); // w:00000010=2
w=r|n; // w:00000011=3
printf("%d",w);
w=r^n; // w:00000001=1
printf("%d",w);
return 0;
}
(4)赋值操作符
= += -= *= /= &= ^= |= >>= <<=
功能:右侧进行运算赋给左值
x+=y等价于x=x+y,其他赋值操作符相同道理
Eg:
#include <stdio.h>
int main()
{
int r=2;
int w=3;
w=r; //w=2
printf("%d",w);
w+=r; //w=4
printf("%d",w);
return 0;
}
(5)单目操作符
! 逻辑反操作符
- 负值
+ 正值
& 取地址
sizeof 计算数据类型所占字节数
~ 对一个数的二进制数按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
1.Eg:(!) n为整数,当n=0时,!(n)=1,当n不等于0时,!(n)=0
#include <stdio.h>
int main()
{
int r=0;
int n=1;
if(!r) // 本来r不为0,条件才为真,加上逻辑反操作符后,r为0,条件才为真
{
printf("linqinyan"); //所以条件成立,打印linqinyan
}
if(!n) //条件为假,跳过此语句
{
printf("lqy");
}
return 0;
2.Eg:(-)(+)(~)
有符号数(符号位不变)
正数:源码、反码、补码相同(二进制最高位为0)
负数:源码、反码、补码不同,要进行计算(二进制最高位为1)
无符号数:源码、反码、补码相同
有符号数(正数)无符号数:以源码的形式进行存储(二进制)
1 00000001 源码
00000001 反码
00000001 补码
有符号数(负数)的存储方式:以补码的形式进行存储(二进制)
-1 10000001 源码
11111110 反码
11111111 补码
a=0 00000000(二进制数)
~a 11111111(二进制数)
3.Eg:(&)(*)
&后面为一个量,每一个量都对应一块属于自己的存储空间,每一个存储空间都有一个属于自己的编号,这个编号称为地址,因为指针指向的是一个地址,所以可以称指针为地址。
一级指针一般表示形式表示为int* q,指的是int*类型的变量q, 二级指针一般形式表示为 int** q,指的是int**类型的变量q,以此类推,若q为一个int类型的指针变量,对q进行解引用操作,可以表达为*q
解引用操作:*q为一个量的地址,进行解引用就是把地址里的值取出来
Eg:
#include <stdio.h>
int main()
{
int r=10;
int* q=&r; //类型需相同才能赋值,传过去的为一个地址(编号)
*q=20;
printf("%d",r); //通过指针q找到了r的地址,进行 解引用操作(*)更改了r里的值 打印20
return 0;
}
4.Eg:(sizeof) (类型)
sizeof():计算数据类型所占字节数,()里只能存放一种数据类型,若想计算多个数据类型,可使用多个sizeof()。
#include <stdio.h>
int main()
{
int r=0;
float n=1;
n=(float)r; //类型不相同,进行强制类型转换
printf("%d",sizeof(int)); //4
printf("%d',sizeof(n)); //n为float类型,打印4
return 0;
}
5.Eg:(--)(++)
i-- 先使用,后自减-1
i++ 先使用,后自增+1
--i 先自减-1,后使用
++i 先自增+1,后使用
#include <stdio.h>
int main()
{
int r=0;
int w=1;
int n=2;
r=(w++)+(--n); //r=1+(2-1)
printf("%d",w); //2
printf("%d',n); //1
printf("%d",r); //2
return 0;
}
(6)关系运算符
> 大于号
>= 大于等于号
< 小于号
<= 小于等于号
!= 用于测试“不相等”
== 用于测试”相等“
注释:条件为真则为1,条件为假则为0
Eg:题目比较输入两个数的大小关系
#include <stdio.h>
int main()
{
int r=0;
int n=0;
while(scanf("%d %d,&r,&n)==2) //scanf的返回值为输入数据的个数,条件成立则为真
{
if(r==n)
{
printf("%d=%dn",r,n);
}
else if(r>n)
{
printf("%d>%dn",r,n);
}
else
{
printf("%d<%dn",r,n);
}
return 0;
}
(7)逻辑运算符
&& 逻辑与 条件都满足则为真,有一个为假则为假
|| 逻辑或 条件有一个满足则为真,两个为假则为假
Eg:判断一个整数M是否能被5整除且能被3整除(要求:1<=M<=100)
#include <stdio.h>
int main()
{
int M=0;
scanf("%d”,&M);
if(1<=M<=100)
{
if(M%5==0&&M%3==0)
{
printf("YES");
}
else
{
printf("NO");
}
}
return o;
}
(8)条件操作符
exp1?x:y //首先判断exp1是否成立,若exp1为真则返回x,若exp1为假则返回y
Eg:
#include <stdio.h>
int main()
{
int r=1;
int n=2;
printf("%d",n<r?r,n);
return 0;
}
(9)逗号表达式
exp1,exp2,exp3....expn //赋值时取最后一个表达式的值
Eg;
#include <stdio.h>
int main()
{
int r=0;
int n=1;
int i=2;
r=(n++),(--i),(n+i); //r=1,1,3
printf("%d",r); //r=3
return 0;
}