文章目录
常量、变量、表达式、判断、分支、循环、数据类型
1.变量定义
int price;
int price=10,amout=20;
注意:ANSIC只能在开头的地方定义变量,而C99可在任意地方。
2.常量
const int AMOUNT = 100;
修饰符const表示常量,只能初始化。
3.基础类型
整数:char,short,int,long,(C99: long long)
浮点数:float,double,(C99: long double)
逻辑:(C99: bool)
指针
自定义类型
表达的数的范围:char < short < int < float < double
整数类型在内存中为二进制数(补码),浮点数为编码。(编码不可以直接拿来做运算)
int和long的字节取决于编译器(CPU)
4.sizeof
sizeof是一个运算符,可以给出某个类型或变量在内存中占据的字节数。
`printf("res=%ld",sizeof(int)); sizeof(long) sizeof(double) sizeof(a)`
5.补码
我们希望-1 + 1 -> 0。如何做到?
0 -> 00000000
1 -> 00000001
11111111 + 00000001 -> 100000000
因为0 - 1 -> -1,所以:
-1 = (1)00000000 - 00000001 -> 11111111
当11111111被当作纯二进制看待时是255,被当作补码时是-1。
同理:对于-a,其补码是0-a,实际是2^n-a,n是这种类型的位数。
对于一个字节(8位),可以表达00000000~11111111
其中 00000000 -> 0
11111111 ~ 10000000 -> -1 ~ -128
00000001 ~ 01111111 -> 1 ~ 127
6.unsigned
在常量后加u或U,表示为unsigned。 (用l或L表示Long)
unsigned的初衷并非扩展数能表达的范围(这是附带的副作用),
而是为了做纯二进制运算,主要是为了移位。
将它们看成一个圆,
补码:0-1=-1,-1+1=0,但是127+1=(-128),(-128)-1=127
补码:0,……,100,……,127,-128,……,-100,-1,0
unsigned:0-1=255,255+1=0
unsigned char co = 255; //不表达负数(补码)
char c = 255; //补码
int i = 255; //二进制
printf("c=%d, i=%d\n", c, i);
//c=-1, i=255
7.探究最大数
//找出int类型最大的数
#include <stdio.h>
int main()
{
int a=0, b=0;
while(++a > 0)
{
b = a;
}
printf("big int : %d\n", b);
int i = 1;
while((b=b/10) != 0)
{
i++;
}
printf("max num of digits : %d\n", i);
return 0;
}
//找出unsigned类型最大的数
#include <stdio.h>
int main()
{
int a = 0;
while(a > 0){
a++;
}
printf("big unsigned : %u", a-1);
return 0;
}
8.整数的格式化
- 只有两种形式:int或long long`
- %d : int
- %u : unsigned
- %ld : long long
- %lu : unsigned long long
- scanf要输入short时需要%hd.
进制:bin、oct、dec、hex
printf(“value hex into oct : %o”,0x12);
9.浮点的输入输出
类型 | scanf | printf |
---|---|---|
float | %f | %f,%e |
double | %lf | %f,%e |
-
%e 输出科学记数法
- double ff = 123.4567;
- printf("%e, %f\n",ff,ff);
- 1.234567e+002, 123.456700
-
%.nf 指定输出小数点后n位(四舍五入)
- printf("%.3f \n", -0.0078);
- printf("%.30f \n", -0.0078);
- printf("%.3f \n", -0.00078);
- printf("%.3f \n", -0.00024);
- -0.008
- -0.007799999999999999600000000000
- -0.001
- -0.000
-
inf表示无穷大、nan表示不存在
- 只应用于浮点数
- printf("%f\n", 12.0/0.0)
- printf("%f\n", -12.0/0.0)
- printf("%f\n", 0.0/0.0)
- inf
- -inf
- nan
10.字符的输入输出
|类型|符号|
|:---:|:---:|
|char|%c|
|int|%d|
-
一个字符加一个数得到ASCII码表中那个数后的字符
char c = 'a'; c += 2; printf("%c\n",c); //c
-
两个字符的减,得到它们在码表中的距离
int i = 'z' - 'a'; printf("%d \n",i); //25
-
a+‘a’-‘A’ 可以将大写字母变为小写;
-
a+‘A’-‘a’ 可以将小写字母变为大写。
11.逃逸字符
字符 | 意义 | 字符 | 意义 |
---|---|---|---|
\b | 回退一格 | " | 双引号 |
\t | 到下一个表格位 | ’ | 单引号 |
\n | 换行 | \ | 反斜杠本身 |
\r | 回车 |
printf("abc") abc
printf("abc\bh") abh
12.逻辑类型
`#include <stdbool.h>` 导入之后即可使用bool、true、false
使用%d输出为1即是true。
13.逻辑运算
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
! | 逻辑非 | !a | 若a是true则结果为false |
&& | 逻辑与 | a&&b | 若a和b都是true则结果是true、 否则是false |
|| | 逻辑或 | a||b | 若a和b有一个是true则结果是true, 两个都是false则结果是false |
-
如何表达数学中的区间?
- x∈[2,6] ==> x>=2&&x<=6
-
判断字符c是否为大写字母?
- c >= ‘A’ && c <= ‘Z’
-
理解 !age<20 ?
- 因为感叹号是和age结合在一起的,所以age如果是0,则变为1;
- 如果不是0,则变为0;无论是0还是1都是小于20的,所以结果一直为true。
-
逻辑符号的
优先级
:- ! > && > ||
14.优先级:
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () | 从左到右 |
2 | ! + - ++ – | 从右到左(单目+和-) |
3 | * / % | 从左到右 |
4 | + - | 从左到右 |
5 | < <= > >= | 从左到右 |
6 | == != | 从左到右 |
7 | && | 从左到右 |
8 | || | 从左到右 |
9 | = += -= *= /= %= | 从右到左 |
15.条件运算符
count = (count>20) ? count-10 : count+10
如果count大于20则将其减10后赋给count,否则将其加10赋给count。
- 优先级
- m < n ? x : a+5
- a++ >= 1 && b-- <= 4 ? a : b
- x=3*5 > 5 ? 5 : 20
16.逗号运算符
逗号用来连接两个表达式,并以其右边的表达式的值作为
它的结果。 逗号的优先级是所有的运算符中最低的,
所以它两边的表达式会先计算。
目前只有一种用法,在for中使用:
for(i=0,j=10;i<j;i++,j--)