笔记
一.运算符(昨天延续)
1.1逻辑运算符
&&(与):全真则真,一假则假
||(或):一真则真,全假则假
!(非):非真则假,非假则真
示例: 0为假 1为真
#include<stdio.h>
int main(int argc, char const *argv[])
{
printf("%d\n",2>3);//0
printf("%d\n",22>3);//1
printf("%d\n",!(2>3));//1
printf("%d\n",12>3&&8<6);//0
printf("%d\n",12>3||8<6);//1
return 0;
}
截断法则:
逻辑与运算中,前边的表达式结果为假,后边的表达式不再执行,直接返回假
逻辑或运算中,前边的表达式结果为真,后边的表达式不再执行,直接返回真
示例:
#include<stdio.h>
int main(int argc, char const *argv[])
{
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
return 0;
}
1.2位运算符
位运算中整数要以二进制的补码形式进行运算,得到结果后转为原码得到整数值
二进制数 0 1
二进制码:
原码 | 反码 | 补码 | |
正数 | 相同 | 相同 | 相同 |
负数 | 相同 | 除符号位外,其他按位取反 | 反码+1 |
示例:
原码;
7: 0000 0000 0000 0000 0000 0000 0000 0111
-7: 1000 0000 0000 0000 0000 0000 0000 0111
反码:(符号位为左边第一位 0为正 1为负)
7: 0000 0000 0000 0000 0000 0000 0000 0111
-7: 1111 1111 1111 1111 1111 1111 1111 1000
补码:
7: 0000 0000 0000 0000 0000 0000 0000 0111
-7: 1111 1111 1111 1111 1111 1111 1111 1001
& | ^ ~ << >>
&位与:全1则1,有0则0
示例:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int a=12,b=10;
int c=a&b;
//位运算先将十进制转换成二进制,再将二进制按位进行与运算得到结果
//12:1100
//10:1010
//& :1000
printf("%d\n",c);//8
return 0;
}
|位或:有1则1,全0则0
^异或:相同为0,不同为1
示例:实现两个变量值的交换
#include<stdio.h>
int main(int argc, char const *argv[])
{
int a=12,b=10;//a=1100,b=1010
a=a^b;//a=0110=6,b=1010=10
b=a^b;//a=0110=6,b=1100=12
a=a^b;//a=1010=10,b=1100=12
printf("%d %d",a,b);
}
~取反:1---->0 0------>1
示例:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int a=7;
int c=~a;
printf("%d\n",c);//-8
}
补码:
7: 0000 0000 0000 0000 0000 0000 0000 0111
~7: 1111 1111 1111 1111 1111 1111 1111 1000
反码:
~7: 1111 1111 1111 1111 1111 1111 1111 0111
原码:
~7: 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-1)) \\ a为要置一或零的数
置零公式:a&(~(1<<(n-1))) \\n为该数要置一或零的位数
1.3关系运算符
> >= < <= == !=
==等于 =赋值
1.4三目运算符(选择运算符)
? :
1.5赋值运算符
= += -= *= /= %=
1.6运算符优先级
单算移关与 异或逻条赋
单目运算符: ~ ++ -- !
算术运算符: * / % + -
移位运算符: << >>
关系运算符: > >= < <= == !=
位与运算符: &
异或运算符: ^
位或运算符: |
逻辑运算符: && ||
条件运算符: ?:
赋值运算符: = += -= *= /= %=
-
二.变量
-
变量:程序运行过程中会发生变化
格式:
存储类型 数据类型 变量名
存储类型:决定变量存储位置
数据类型:决定变量开辟空间大小
变量名:遵循标识符命名规则
名字
字节大小
int
整型
4
char
字符型
1
short
短整型
2
long
长整型
8
float
单精度浮点型
4
double
双精度浮点型
8
printf("%ld\n",sizeof(long));可查看类型所占字节的大小
局部变量和全局变量的区别:
局部变量
全局变量
定义位置
函数体内部
函数体外部
初值
未初始化,值是随机值
未初始化,值是0
存储位置
栈区
全局区
生命周期
同当前函数体共存亡
同整个程序共存亡
作用域
当前函数体内部
整个程序
-
三.常量
程序运行过程中不会发生变化
3.1 整型常量
八进制 十进制 十六进制
3.2 字符常量
字符 由' '包裹一个字符
字符串 由" "包裹,由'\0'作为字符串的结束标志
字符数组
3.3 浮点型常量
float double
3.4 标识常量
宏定义:
格式:#define 宏名 常量值或表达式或代码段
宏名:一般用大写表示,为了和普通变量区分开
注意:先原样替换,再计算。
示例:
#include<stdio.h>
#define N 2
#define M N+2
#define MUN 2+M*3+1
int main(int argc, char const *argv[])
{
printf("%d %d %d\n",N,M,MUN);//MUN=2+2+2*3+1=11
return 0;
}
作业
一
宏定义要先原样替换再计算
a=10/(2+1*2+1/2+1*2+1);
因为是整形除法向下取整,所以a=10/7,a=1
二
宏定义要先原样替换再计算
k=5+5*5+5*5=55 选c