<1>运算符
1.1逻辑运算符
&& 逻辑与:全真则真,有假则假
|| 逻辑或 :有真则真,全假则假
!逻辑非 :非真则假,非假则真
0为假 1为真
printf("%d\n",2>3); //0
printf("%d\n",22>3); //1
printf("%d\n",12>3&&8<6); //0
printf("%d\n",12>3||8<6); //1
printf("%d\n",12>3 && !(8<6)); //1
printf("%d\n",!1); //0
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); //m=a>b为假,m=0 ,后面的n=c>d就不再执行,n=2
printf("%d %d",m,n); //0 2
}
最后输出结果为 m=0 n=2
1.2 位运算符
1.21 原码 反码 补码
原码 | 反码 | 补码 | |
正数 | 相同 | 相同 | 相同 |
负数 | 相同 | 除符号位外,其他按位取反 | 反码+1 |
练习:
int a=12,b= -10;
int c=a&b;
printf("%d\n",c);
过程:
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
1.2.2 & | ^ ~ << >>
用二进制数表示 : 0 1
符号: & | ^ ~ << >>
&位与: 全 1 则 1,有 0 则 0
| 位或: 有 1 则 1,全 0 则 0
^ 异或: 相同为 0,不同为 1
~ 取反: 1----->0 0----->1
<<左移
>>右移
练习:
1. 变量x和y的值相等,且为非零值,则以下选项中,结果为0的表达式是(D)
A.x||y B.x|y C.x&y D.x^y
2. a=12 ,b=10,怎么只用位运算符交换数值
~ 取反:1-->0 0-->1
int a=7;
int c=~a;
printf("%d\n",c); //-8
===========================
7补码:
0000 0000 0000 0000 0000 0000 0000 0111
~a:
补码
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
结果 : c = -8
<< 左移 : 左移n位,右边补充n个0
公式: a<<n==a*2^n
13|(1<<1)
13: 1101
1: 001
1<<1: 0010
结果:1111---15
>> 右移 :右移n位,最右边舍弃n位
公式: a>>n==a/2^n
置一公式:a|(1<<n)
置零公式:a&(~(1<<n))
练习:
1.以下程序升输出结果是(A)。
int main()
{
char x=040; // 040是8进制,转换为2进制为:100 000 ==0100
printf("%o\n",x<<1); //左移1位 1 000 000 ,再转换为8进制为 100
return 0;
}
A.100 B.80 C.64 D.32
2.已知:int x =1, y=-1;则语句printf("%d\n",(x-- & ++y));输出结果是(B)
A.1 B.0 C.-1 D.2
3.已知 啊=13 ,a<<2 的十进制数值为 (52)
// 13*2^2=52
1.3 关系运算符
> >= < <= == !=
==等于 =赋值
表示范围2--9 : x>2&&x<9
1.4 三目运算符(选择运算符)
? :
表达式1?表达式2:表达式3;
先求解表达式1,
若其值为真(非0)则将表达式2的值作为整个表达式的取值,
否则(表达式1的值为0)将表达式3的值作为整个表达式的取值。
例如:
1、max=(a>b)?a:b
就是将a和b二者中较大的一个赋给max。
2、min=(a<b)?a:b
就是将a和b二者中较小的一个赋给min。
int a=5,b=9;
int c=a>b?a:b;
printf("%d\n",c); //9
1.5 赋值运算符
= += -= *= /= %=
a-=5; // a=a-5;
1.6 运算符优先级
单目运算符: ~ + + -- !
算术运算符: * / % + -
移位运算符: << >>
关系运算符: > >= < <= == !=
位与运算符: &
异或运算符: ^
位或运算符: |
逻辑运算符: && ||
条件运算符: ? :
赋值运算符: = += -= *= /= %=
练习:
1.设int b=2; 表达式(b>>2)/(b>>1) 的值是 (A)
A.0 B.2 C.4 D.8
2.设有以下语句,则c的二进制值是 (A)
char a=3,b=6,c; // <<优先级比 ^高,先计算b<<2,再算a^b
c=a^b<<2; // b:110 <<2:11000 a:00011
A.00011011 B.00010100 C.00011100 D.00011000
3.int x=2,y=3,z=4;则表达式x+(y>!z)的值为(3)
1.7 标点符号
英文 , ; [ ] {} () ....
1.8 分隔符
空格 tab \n
<2> 变量
程序运行过程中会发生变化
格式:
存储类型 数据类型 变量名
int a;
存储类型:决定变量存储位置
数据类型:决定变量开辟空间大小
变量名:遵循标识符命名规则
名字 | 字节大小 | 取值范围(了解就行) | |
int | 整形 | 4 | |
char | 字符型 | 1 | -2^7 ~ 2^7-1 |
short | 短整型 | 2 | |
long | 长整型 | 8 | |
float | 单精度浮点型 | 4 | 实际有效位数:6~7位 |
double | 双精度浮点型 | 8 | 实际有效位数:15~16位 |
局部变量和全局变量的区别:
局部变量 | 全局变量 | |
定义位置 | 函数体内部 | 函数体外部 |
初值 | 未初始化,值是随机值 | 未初始化,值是0 |
存储位置 | 栈区 | 全局区 |
生命周期 | 同当前函数体共存亡 | 同整个程序共存亡 |
作用域 | 当前函数体内部 | 整个程序 |
<3>常量
3.1 整型常量
3.2 字符常量
字符串 由" "包裹,由'\0'作为字符串的结束标志
字符数组----》
3.3 浮点型常量
3.4 标识常量
宏定义:
格式:#define 宏名 常量值或表达式或代码段
宏名:一般用大写表示,为了和普通变量区分开
注意:先原样替换,再计算。
![](https://img-blog.csdnimg.cn/direct/05ca8f08b11f42399a2d0fc8b3652425.png)
![](https://img-blog.csdnimg.cn/direct/c60a0b47fcd54cdbbac66d0c12fdafdc.png)
![](https://img-blog.csdnimg.cn/direct/e947de1c65cf4ad2ad0a4a7df5ad9fa7.png)
作业:
1.程序运行后的输出结果是 ( 1 )
// a /= k+m * k+m / k+m * k+m = 2+1*2+1/2+1*2+1= 2+2+1*2+1=7
// a=10/7=1
2. 结果是(C)
![](https://img-blog.csdnimg.cn/direct/6ae8ffb79f5042bc8e7d4dae3a667b12.png)