运算符
1.1逻辑运算符
与 :&& 全真则真,有假则假;
或 :|| 一真则真,全假则假;
非 :! 非真即假,非假即真;
判断是否成立,输出结果为0(否)或1(是);
终端验证条件是否成立:
printf("%d\n",118>99); // 条件成立输出 1
printf("%d\n",18>99); // 条件不成立输出 0
printf("%d\n",118>99 && 5>9 ); // 输出 0
printf("%d\n",118>99 || 5>9 ); // 输出 1
printf("%d\n",!(118>99) || 5>9 ); // 输出 0
0为假,非零为真
printf("%d\n",5&&6); // 1
printf("%d\n",(10/2)&&6); // 1
printf("%d\n",(10/2==5)&&6); // 1
截断法则
逻辑与运算中,前边表达式结果为假,后边表达式不再执行,返回假;
逻辑或运算中,前边表达式结果为真,后边表达式不再执行,返回真;
例:
解析:
(m=a>b)为假,后面表达式不再执行,则n=2;
1.2位运算符
位与:& 位或: | 异或: ^ 取反:~ 左移: << 右移: >>
& 位与:全1则1,有0则0
| 位或:有1则1,全0则0
^ 异或:相同为0,不同为1
int a=6,b=10; 将6和10换算为二进制数:
int c=a&b //6 : 0110
↓↓↓↓ 按位比较
printf("%d\n",c);//输出2 //10:1010 全1则1,有0则零
↓↓↓↓
//&: 0010换算为十进制数→→2
负数运算
整数以补码的二进制进行存储、计算
原码 | 反码 | 补码 | |
正数 | 相同 | 相同 | 相同 |
负数 | 相同 | 原码除符号位之外,其他按位取反 | 反码+1 |
int a=-6,b=10;
int c=a&b;
printf("%d\n",c); //10
int 4字节 = 32位
-6原码: 最左边表示符号位 0正数 1负数
1000 ... 0110
-6反码:
1111 ... 1001
-6补码:
1111 ... 1010
10补码:
0000 ... 1010
-6补码 & 10补码:
1111 ... 1010
0000 ... 1010
0000 ... 1010 补码 10
~ 取反:
1-->0 0-->1
int a=-6;
int c=~a;
printf("%d\n",c); //5
-6原码: 最左边表示符号位 0正数 1负数
1000 ... 0110
-6反码:
1111 ... 1001
-6补码:
1111 ... 1010
~ 取反:
0000 ... 0101 === 5
<<左移
左移几位,右边补几个0
int a=6<<2; //6转成二进制→110,再左移两位→11000
printf("%d\n",a); //11000===24
右移两位也可这么计算:
6*2^2=24
-6*2^2=-24
X右移n位,即:结果=X*2^n
>>右移
右移几位,右边丢弃几位
6>>2 //6转成二进制→110,再右移→001
6/2^2=1
1.3关系预算符
大于:> 大于等于: >= 小于:< 小于等于:<=
等于:== 不等于:!=
1.4 三目运算符 (条件运算符)
表达式1 ? 表达式2 : 表达式3;
int a=3,b=5;
int max=a>b?a:b; 判断表达式1是否成立,成立执行表达式2,不成立执行表达式3;
printf("%d\n",max); //5
1.5 赋值运算符
赋值:= 加等:+= 减等:-= 乘等:*=
除等:/= 取余等:%=
a-=5 <===> a=a-5;
扩展:逗号运算符(顺序求值运算符)
(表达式1,表达式2,表达式3,...,表达式n)
运算结果是最后一个表达式的结果
int a=3,b=5; 运算结果是最后一个表达式结果:
a=(a*3,a+2,a-1); a = a-1 = 2
printf("%d\n",a); //2
优先级
单算移关与 异或逻条赋
单目运算符:++ -- ~ !
算术运算符: / * % + -
移位运算符: << >>
关系运算符:> >= < <= == !=
位与运算符:&
异或运算符:^
位或运算符:|
逻辑运算符:&& ||
条件运算符:? :
赋值运算符: = ......
分隔符
空格 tab 换行
变量
程序运行过程中会发生变化的量
格式:
存储类型 数据类型 变量名
(auto) int a;
存储类型: 决定变量存储的位置
数据类型 :决定开辟空间大小
变量名 : 遵循标识符命名规则
名称 | 大小(字节) | 取值范围(了解) | |
int | 整型 | 4 | |
char | 字符型 | 1 | -2^7~2^7-1 |
short | 短整型 | 2 | |
long | 长整型 | 32位:4;64位:8 | |
float | 单精度浮点型 | 4 | 有效位数:6-7位 |
double | 双精度浮点型 | 8 | 15-16位 |
局部变量和全局变量的区别
局部变量 | 全局变量 | |
定义位置 | 函数体内部 | 函数体外边 |
初值 | 未初始化,值为随机值 | 未初始化,值为0 |
作用域 | 当前函数体内部 | 整个程序 |
生命周期 | 同当前函数共存亡 | 同整个函数体共存亡 |
存储位置 | 栈区 | 全局区 |
32: 2^32字节==4G
64: 2^64 2^484
栈区: 系统自动开辟、回收 (函数体内部定义的变量)
堆区: 程序员手动开辟(malloc)、回收(free)
全局区、 静态区: 全局变量、static修饰的变量
常量区: char *p="hello"
常量
数值型常量
八进制 十进制 十六进制
浮点型常量
float double
字符常量
程序中用‘ ’包裹
char a='q';
char b='\n'; \n换行
char c='n'; n字符
转义字符:\
char a='A';
printf("%c\n",a); //A
char b='123';
printf("%c\n",b); //'3'
char c=0101;
printf("%c\n",c); //A
char d='\101';
printf("%c\n",d); //A
char e='\x41';
printf("%c\n",e); //A
字符串常量
结束标志:用" "包裹 '\0'字符串
例: "hello" 5个字符+'\0'字符串结束标志 == 6个字符
标识常量
宏定义
格式:#define 宏名 常量值 或 表达式 或 函数
宏名:一般用大写,目的跟变量区分开
特点:先进行单纯的替换,替换完之后再计算
#define N 2 // N=2
#define M N+3 // M=N+3=2+3
#define NUM N+M/2+1 // NUM=N+M/2+1
void main() ↓
{ = 2+2+3/2+1
int a = NUM;
printf("%d\n",a); //
}
宏定义实现求最大值
#include<stdio.h>
#define MAX a>b?a:b // 定义MAX 为 a>b?a:b
int main()
{
int a=6,b=9;
printf("%d\n",MAX);
return 0;
}