[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);
printf("%d %d",m,n); //0 2
}
int a=1,b=2,c=3,d=4,m=2,n=2;
1.2 位运算符
& | ^ ~ << >>
&位与:全1则1,有0则0
|位或:有1则1,全0则0
^异或:相同为0,不同为1
~取反:1---->0 0------>1
<<左移:左移n位,右边补充n个0 //101<<2=10100
>>右移:右移n位,最右边舍弃n位//101>>2=1
置一公式:a|(1<<n)
置零公式:a&(~(1<<n))
例子:置一 置零
将a的第4位置零置一 将a的第5位置零置零
a=110010 a=110010
1<<3将1左移3位->1000 1<<3将1左移3位->1000
110010|1000=111010 ~1000=0111
110010&0111=
计算机中,整数以二进制的补码形式存储,计算的
原码、反码、补码
原码 | 反码 | 补码 | |
正数 | 相同 | 相同 | 相同 |
负数 | 相同 | 除符号位外,其他按位取反 | 反码+1 |
int 4字节=32位 1字节=8位
符号位:最左边 0正数 1负数
例子
原码
12: 0000 0000 0000 0000 0000 0000 0000 1100
-12:1000 0000 0000 0000 0000 0000 0000 1100
反码
12: 0000 0000 0000 0000 0000 0000 0000 1100
-12:1111 1111 1111 1111 1111 1111 1111 0011
补码
12: 0000 0000 0000 0000 0000 0000 0000 1100
-12:1111 1111 1111 1111 1111 1111 1111 0100
12&-12=0000 0000 0000 0000 0000 0000 0000 0100=4
练习变量x和y的值相等,且为非零值,则以下选项中,结果为0的表达式是( D )A.x||y B.x|y C.x&y D.x^y
//^异或相同为0
实现a=12,b=10变量值的交换:
a=a^b; //1100^1010=0110b=a^b; / 0110^1010=1100
a=a^b; //0110^1100=1010
printf("%d %d\n",a,b);
以下程序升输出结果是( A)。int main()
{
char x=040; // 040为8进制 040=000 100 000
printf("%o\n",x<<1); //%o为八进制 左移一位 0 001 000 000 =100
return 0;
}
A.100 B.80 C.64 D.32
已知:int x=1,y=-1;则语句printf("%d\n",(x--&++y));的输出结果为0
//首先执行++y 然后& 最后x++
已知a=13,a<<2的十进制数值为(52)
//a*2^2
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原码:
c=1000 0000 0000 0000 0000 0000 0000 1000===-8
1.3 关系运算符
.> >= < <= == !=
1.4三目运算符 ?:
表达式1 ? 表达式2 : 表达式3
例子
int a=5,b=9;int c=a>b?a:b;
printf("%d\n",c); //9
1.5 赋值运算符
= += -= *= /= %=
a+=b //a=a+b
1.6 运算符优先级
口诀:单算移关与 异或逻条赋
单目运算符: ~ ++ -- !
算术运算符: * / % + -
移位运算符: << >>
关系运算符: > >= < <= == !=
位与运算符: &
异或运算符: ^
位或运算符: |
逻辑运算符: && ||
条件运算符: ?:
赋值运算符: = += -= *= /= %=
练习
设int b=2;表达式 (b>>2)/(b>>1)的值是()A.0 B.2 C.4 D.8
设有以下语句,则c的二进制是(00011011)
char a=3,b=6,c;
c=a^b<<2;
int x=2,y=3,z=4;则表达式x+(y>!z)的值为()
[2]变量:程序运行过程中会发生变化
格式:存储类型 数据类型 变量名
存储类型:决定变量存储位置
数据类型:决定变量开辟空间大小
变量名:遵循标识符命名规则
函数 | 函数名 | 字节大小 |
int | 整型 | 4 |
char | 字符型 | 1 |
short | 短整型 | 2 |
long | 长整型 | 8 |
float | 单精度浮点型 | 4 |
double | 双精度浮点型 | 8 |
printf("%ld\n",sizeof(long)); // 可以使用 sizeof 函数查看字节大小
局部变量和全局变量的区别:
局部变量 | 全局变量 | |
---|---|---|
定义位置 | 函数体内部 | 函数体外部 |
初值 | 未初始化,值是随机值 | 未初始化,值是0 |
存储位置 | 栈区 | 全局区 |
生命周期 | 和函数一起 | 和程序一起 |
作用域 | 当前函数体内部 | 整个全局 |
[3]常量:程序运行过程中不会发生变化
3.1 整型常量
八进制 十进制 十六进制
3.2 字符常量
字符------‘ ’ 单引号
字符串-----“ ”双引号
3.3浮点型常量
float double
3.4 标识常量
宏定义:
格式:#define 宏名 常量值或表达式或代码段
宏名:一般用大写表示,为了和普通变量区分开
注意:先原样替换,再计算
例子
#define n 1
#define m 3+n
#define b 2+3*m-n//b 的结果为 2+3*3+n-n
宏函数
全局函数,随时变换
#include<stdio.h>
#define NUM(a,b) a>b?a:b
int main(){
int a=10,b=20;
printf("%d\n",NUM(a,b));
return 0;
}//最后输出最大值
作业
#include<stdio.h>
#define SQR(X) X*X
void main(){
int a=10,k=2,m=1;
a/=SQR(k+m)/SQR(k+m);
printf("%d\n",a);
}//输出值为1,当调用宏函数的时候,先原样替换,再计算