[1]运算符
逻辑运算符
&& 逻辑与:全真则真,一假则假|| 逻辑或:一真则真,全假则假
! 逻辑非:非真则假,非假则真
0为假 1为真
printf("%d\n",2>3); //0
printf("%d\n",22>3);//1
0为假 非0值为真
printf("%d\n",81&&10); //1
截断法则:
逻辑与运算中,前边的表达式结果为假,后边的表达式不再执行,直接返回假
逻辑或运算中,前边的表达式结果为真,后边的表达式不再执行,直接返回真
例题:
#include <stdio.h>
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
(m=a>b)&&(n=c>d);
printf("%d %d",m,n); //0 2
}
程序运行结果为m=0;n=2
位运算符
二进制数 0 1
& | ^ ~ << >>
----------------------------------
& 位与: 全1则1,有0则0
| 位或: 有1则1,全0则0
^ 异或: 相同为0,不同为1
~ 取反: 1---->0 0------>1
例题:
c的值是多少?
#include<stdio.h>
int main()
{
int a=12,b10;
int c=a&b;
printf("%d\n",c); //8
return 0;
}
12:1100
10:1010
a&b:1000==8
如何实现两个变量值的交换?
int a=12,b=10;
(1)
int temp=0;
temp=a;
a=b;
b=temp;
printf("%d %d\n",a,b);
(2)
a=a^b;//0110==6
b=a^b;//0110 1010 1100=12
a=a^b;//0110 1100 1010=10
printf("%d %d\n",a,b);
计算机中,整数以二进制的补码形式存储,计算的原码、反码、补码。
原码 | 反码 | 补码 | |
正数 | 相同 |
相同
| 相同 |
负数 | 相同 |
除符号位外,其他按位取反
| 反码+1 |
int 4字节=32位;1字节=8位
符号位:最左边一位 0为正数 1为负数
12:正数最左边为0
0000 0000 0000 0000 0000 0000 0000 1100
-12:负数最左边为1
1000 0000 0000 0000 0000 0000 0000 1100
例题:
int a=12,b=-10; //12:1100 10:1010
int c=a&b;
printf("%d\n",c); //4
12补码:
0000 0000 0000 0000 0000 0000 0000 1100
-10原码:
1000 0000 0000 0000 0000 0000 0000 1010
-10反码:
1111 1111 1111 1111 1111 1111 1111 0101
-10补码:
1111 1111 1111 1111 1111 1111 1111 0110
12补码 & -10补码:
0000 0000 0000 0000 0000 0000 0000 1100
1111 1111 1111 1111 1111 1111 1111 0110
0000 0000 0000 0000 0000 0000 0000 0100===4
(~) 取反例题:
int a=7;
int c=~a;
printf("%d\n",c);//-8
-------------------------------------------------------------------------------------------------------------------------
7补码:
0000 0000 0000 0000 0000 0000 0000 0111
~: 补码
1111 1111 1111 1111 1111 1111 1111 1000 1000=8 0111
反码:
1111 1111 1111 1111 1111 1111 1111 0111
原码:
1000 0000 0000 0000 0000 0000 0000 1000==-8
<<左移:左移n位,右边补充n个0
6<<2==24
公式:
6*2^2= 24
-6*2^2=-24
>>右移:右移n位,最右边舍弃n位
6>>2==1
公式:
6/2^2=1
-6/2^2=-2
置一公式:a|(1<<n)
置零公式:a&(~(1<<n))
关系运算符
> | >= | == | < | <= | != |
==等于 =赋值
2~9 x>2&&x<9
三目运算符 (选择运算符)
? :
表达式1? 表达式2:表达式3;
例题:
int a=5,b=9;
int c=a>b?a:b;
printf("%d\n",c); //9
两个数取最大值
赋值运算符
= | += | -= | /= | %= | *= |
a-=5; 相当于a=a-5;[其它同理]
运算符优先级
单算移关与 异或逻条赋
单目运算符 | ~ ++ -- ! |
算术运算符 | * / % + - |
移位运算符 | << >> |
关系运算符 | > >= < <= == != |
位与运算符 | & |
异或运算符 | ^ |
位或运算符 | | |
逻辑运算符 | && || |
条件运算符 | ?: |
赋值运算符 | = += -= *= /= %= |
标点符号
英文 , ; [ ] {} () ....
分隔符
空格 tab \n
[2]变量
程序运行过程中会发生变化
格式:
存储类型 数据类型 变量名
int a
存储类型:决定变量存储位置
数据类型:决定变量开辟空间大小
变量名:遵循标识符命名规则
名字 |
字节大小 |
取值范围(了解) | |
int |
整型 |
4 |
-2147483648 ~ 2147483647 |
char |
字符型 |
1 |
-2^7~2^7-1 |
short |
短整型 |
2 |
-32,768~32,767 |
long |
长整型 |
8 |
-2147483648~2147483647 |
float |
单精度浮点型 |
4 |
3.4*10^-38~3.4*10^38 |
double |
双精度浮点型 |
8 |
1.7*10^-308~1.7*10^308 |
printf("%ld\n",sizeof(long));
局部变量和全局变量的区别:
局部变量 |
全局变量 | |
定义位置 |
函数体内部 |
函数体外部 |
初值 |
未初始化,值是随机值 |
未初始化,值是0 |
存储位置 |
栈区 |
全局区 |
生命周期 |
同当前函数体共存亡 |
同整个程序共存亡 |
作用域 |
当前函数体内部 |
整个程序 |
[3]常量
程序运行过程中不会发生变化
整型常量
八进制 十进制 十六进制
字符常量
字符 由 ' ' 包裹一个字符
字符串 由 " " 包裹,由'\0'作为字符串的结束标志
字符数组----》
浮点型常量
float double
标识常量
宏定义:
格式:#define 宏名 常量值或表达式或代码段
宏名:一般用大写表示,为了和普通变量区分开
注意:先原样替换,再计算。
例题:
[1]
[2]
宏函数(了解)
习题:
a /= k+m*k+m/k+m*k+m = 2+2+0+2+1=7
a = 1
答案:1
2.
k = M+M*M+M*5 = 55
答案:C