[1]运算符
1.1 逻辑运算符
||逻辑或:一真则真,全假则假
!逻辑非:非真则假,非假则真
例如:1>2&&2>1
一真一假,因此为假,输出0;
2>1&&3>2
都为真,因此为真,输出1.
3>4||3>2
有一个真,则为真,输出1
!0 为真,输出1
!23 非零都为真,因此逻辑非为假,输出0。
截断法则:在逻辑与运算,前后表达式中若前面的表达式输出为假,则直接输出假,后面的 表 达式直接不执行。
逻辑或运算中,前后表达式中若前面的表达式输出为真,则直接输出真,后面的表达式直接不执行。
例如:
int a=5,b=6,c=7,d=8,m=2,n=2;
(m=a>b)&&(n=c>d);
这里由于&&只要有一个为假则输出假,而a>b不成立,因此后方的表达式不执行,n的值为2不变。
1.2 位运算符
二进制数 0 1
& | ^ ~ << >>
& 位与:全1则1,有0则0
| 位或:有1则1,全0则0
^ 异或:相同为0,不同为1
~ 取反:1->0 0->1
在计算时,要将数字转化为二进制,再根据位运算符进行比较输出。
计算机中,整数以二进制的补码形式存储,计算的
原码、反码、补码
| 原码 | 反码 | 补码 |
正数 | 相同 | 相同 | 相同 |
负数 | 相同 | 除符号位外,其他按位取反 | 反码+1 |
由表格可得知,当数字为正时,原码、反码、补码都相同,因此当两个正数进行位逻辑运算时只需要使用其原码。当其中有负数时则要使用负数的补码进行计算。其中最左边一位为符号位,0为正,1为负。
例如:
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
<< :左移符号,用于二进制
x<<n
左移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
1.3 关系运算符
> >= < <= == !=
= =等于 =赋值
1.4 三目运算符 (选择运算符)
?
int a=5,b=9;
int c=a>b?a:b;
printf("%d\n",c);
这里c=a>b?a:b的意思是在a、b中取较大的一个赋值给c。
因此c的值为9.
1.5 赋值运算符
= += -= *= /= %=
例如,a-=5 可看作 a=a-5;
其他类似符号同理。
1.6 运算符优先级
顺序:
单算移关与 异或逻条赋
单目运算符: ~ ++ -- !
算术运算符: * / % + -
移位运算符: << >>
关系运算符: > >= < <= == !=
位与运算符: &
异或运算符: ^
位或运算符: |
逻辑运算符: && ||
条件运算符: ?:
赋值运算符: = += -= *= /= %=
其中单目、条件、赋值运算符的优先级是从右至左结合的。
[2]变量
程序运行过程中会发生变化的称为变量。
| 名字 | 字节大小 | 取值范围(了解) |
int | 整型 | 4 | -2^31~ 2^31-1 |
char | 字符型 | 1 | -2^7~2^7-1 |
short | 短整型 | 2 | -2^15~2^15-1 |
long | 长整型 | 8 | -2^63~2^63-1 (64位) |
float | 单精度浮点型 | 4 | -2^-1022~(2-2^52)^1023(64位) |
double | 双精度浮点型 | 8 |
|
局部变量和全局变量的区别:
| 局部变量 | 全局变量 |
定义位置 | 函数体内部 | 函数体外部 |
初值 | 未初始化,值是随机值 | 未初始化,值是0 |
存储位置 | 栈区 | 全局区 |
生命周期 | 同当前函数体共存亡 | 同整个程序共存亡 |
作用域 | 当前函数体内部 | 整个程序 |
[3]常量
程序运行过程中不会发生变化
3.1 整型常量
八进制 十进制 十六进制
3.2 字符常量
字符 由' '包裹一个字符
字符串 由" "包裹,由'\0'作为字符串的结束标志
3.3 标识常量
#define X
与赋值不同,宏的的计算要直接原样替换
例如
#define N 2
#define M N+2
#define NUM 2+M*3+1
M不等于N+2=4,而是直接用N+2替换M带入NUM的计算
所以NUM的计算步骤为 2+N+2*3+1=2+2+2*3+1=11
作业
(k+m)带入宏SQR(X)中
a/=(k+m)*(k+m)/(k+m)*(k+m)
a/=3*3/3*3
从左到右运算可得
a/=9
a=a/9
a=10/9=1
所以结果为1。
原样替换,则k=M+M*M+M*5=5+5*5+5*5=55
所以选C