一运算符
(1)算术运算符
运算符 | 作用 |
+ - * | 两数相加、相减、相乘 |
/ | 如果左右两个操作数都是整形,就是取整运算,结果就是整形 如果有一个操作数是浮点型,结果就是浮点型,除数不能为0 |
% | 要求:两个操作数必须是整形,取余,除数不能为0 |
(2)自增自减
a++ a--:先使用a,然后再加/减1
++a --a:先加/减1,再使用a
a++ ++a题目
#include<stdio.h>
int main(void)
{
int num=0;
int num1=9;
int num2=num1++||++num;//num1为9真,然后加1,||左边为真不需要执行右边了,num2在这里为1
int num3=--num2&&num++||++num1;/* --num2先减后用,&&左边为0,不需要算与右边的了(num++未执
行),所以||左边为0,然后执行++num1,为11.所以num3为1
printf("%d\n",num);// 0
printf("%d\n",num1);// 11
printf("%d\n",num2);// 0
printf("%d\n",num3);// 1
return 0;
}
二,赋值运算符
=:赋值运算
a=b,把右赋给左,b的值赋给a
a+=1 | a=a+1 |
a-=1 | a=a-1 |
a*=1 | a=a*1 |
a/=1 | a=a/1 |
在终端输入一个四位数,输出个位,十位,百位,千位,以及和
#include<stdio.h>
int main(void)
{
int num,a,b,c,d,sum;
printf("请输入一个四位数:");
scanf("%d",&sum);
a=sum%10;
b=sum/10%10;
c=sum/100%10;
d=sum/1000;
printf("个位=%d\n",a);
printf("十位=%d\n",b);
printf("百位=%d\n",c);
printf("千位=%d\n",d);
sum=a+b+c+d;
printf("sunm=%d\n",sum);
return 0;
}
三,关系运算符
非真即假 ,非0即1
0假,1真
== | 判断左右是否相等 |
! | 非 |
a>b | 判断a是否大于b |
a<b | 判断a是否小于b |
a>=b | 判断a是否大于等于b |
a<=b | 判断a是否小于等于b |
四,逻辑运算符
&& 逻辑与 | 两数都真为真 有一个假为假 都假为假 |
|| 逻辑或 | 一个为真就为真 两个都为假才是假 特殊:a||b如果a是真了,没必要计算b了, 逻辑短路现象 |
! 逻辑非 | 逻辑非 |
逻辑同或,逻辑异或,逻辑与,逻辑或_正义的琼的博客-CSDN博客
在终端输入一个数,判断是否在【12,54】区间
#include<stdio.h>
int main(void)
{
int a;
printf("输入一个数:\na=");
scanf("%d",&a);
if(a>=12&&a<=54)
{
printf("在\n");
}
return 0;
}
五,条件运算符
c语言唯一一个三目运算符,三个表达式
表达式1?表达式2:表达式3
先执行1,如果1真,运行2;
如果1假,运行3;
取两个数较大值:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a,b,max;
scanf("%d %d",&a,&b);//12 13
max=a>b?a:b;
printf("%d\n",max);//13
return 0;
}
六,逗号运算符
(表达式1,表达式2,表达式3·····表达式n)
每个表达式都会执行,最后会取最后一个表达式的结果
vim 自动补全
cd ~
cd .vim
cd snippets(ls 下面有各种语言的,我们选c.snippet改c语言的)
vim c.snippet(在最后改,记得加tab 下面用l补)
#include <stdio.h>
int main(int argc, const char *argv[])
{
int num=10,num1=101;
int num2=(num-=10&&(num1+=9)||(num*=3),num++,++num,num1--);
printf("%d\n",num);//2
printf("%d\n",num1);//100
printf("%d\n",num2);//101
return 0;
}
这里的num-=10就没有加括号,在&&中默认先计算左边的表达式,&& ||优先级大于* /
但是括号最大
先计算num-=10,即num=0
七,位运算符
对二进制进行运算的day4 8.c
逻辑同或,逻辑异或,逻辑与,逻辑或_正义的琼的博客-CSDN博客
一般使用无符号数进行运算
两个二进制位结果进行计算
& | 按位与 | 0000 1001 & 0000 1000 = 0000 1000=8 |
| | 按位或 | 0000 1001 | 0000 1000 = 0000 1001=9 |
^ | 按位异或 同0异1 | 0000 1001 ^ 0000 1000= 0000 0001=1 |
~ | 按位取反 | ~ 0000 1001 = 1111 0110=247 |
>> | 按位右移 | 0000 1001 >> 3 =0000 0001=1 |
<< | 按位左移 | 0000 1001<< 2 =0010 0100=36 |
位运算常用于对数据的位置操作
0与任何数都是0,1与任何数都是数本身
0或任何数都是数本身, 1或任何数都是1
0异或任何数都是数本身,1异或任何数都是取反
练习:已知unsigned char data; 写出把data的第三位置1的表达式,把data的第四位置0 的表达式,把data的第六位按位取反的表达式
解:data|=(0x1<<3); data&=~(0x<<4); data^=(0x1<<6)
#include <stdio.h>
int main(int argc, const char *argv[])
{
unsigned char data = 0x76; //0111 0110
data|=(0x1<<3); //0000 1000 = 0x1<<3
printf("%#X\n",data); //0111 0110 | 0000 1000 = 0x7E
此处date的值是上一个值,不是最开始的0x76,以为已经把上一个值存入进去了
data&=~(0x1<<4); //第三位置1:0111 1110 0x7E
printf("%#X\n",data); //1110 1111 ~(0x1<<4)
//0111 1110 & 1110 1111 = 0x6E
data^=(0x1<<6); //第四位置0:0110 1110 0x6E
printf("%#X\n",data); //0110 1110 ^ 0100 0000
return 0; //0100 0000 = 0x1<<6;
} //第六位取反:0010 1110 0x2E
//两数异或,同0异1
//0异或任何数结果都是数本身,
//1异或任何数都是对该位取反
八,sizeof运算符
sizeof求数据的大小
sizeof(数据)括号里面放什么就求什么,
char c = 'a';
printf("%ld",sizeof(int));
printf("%ld",sizeof(short));
printf("%ld",sizeof('a'));
printf("%ld",sizeof(c));
printf("%ld",sizeof("abc"));
printf("%ld",sizeof(char));
结果:
4
2
4
1
3
1
C语言中sizeof()的用法_surplus-G的博客-CSDN博客
九,运算符优先级
单算移关于:
异或逻条赋:
括号的优先级最高