1. 基础常量及函数

1.1 符号常量

1
2
3
4
5
6
7
8
#include <stdio.h>
#define PI 3+2
int main() {
int i = PI * 2;
printf("i=%d\n",i);
printf("i sieze=%d \n",sizeof(i));
return 0;
}

i=7
i sieze=4

因为PI是 符号常量,在 i = PI * 2 时,实际为 i = 3+2*2 即为 7

1.2 浮点型常量

类型强制转换

1
2
3
4
5
6
7
#include <stdio.h>
int main(){
int i = 5;
float j = i/2;
float k = (float)i/2;
printf("j=%f,k=%f",j,k);
}

j=2.000000,k=2.500000
注:

  1. i/2=2 why? 因为/的左右操作数都为int,执行整型操作(整除,左取整)
  2. (float)i/2=2.5 why? 因为/的左操作数此时为 (float)i表达式,类型为float,执行小数运算(除法运算)

1.3 printf函数

代码格式

代码 格式 代码 格式
%d 十进制有符号整数 %p 指针的值
%u 十进制无符号整数 %e 指数形式的浮点数
%f 浮点数 %x 无符号数以十六进制表示的整数
%s 字符串 %o 无符号数以八进制表示的整数
%c 单个字符 %g 把输出的值按照%e或%f类型中输出长度较小的方式输出

对齐示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(){
int num=10;
float value=96.3;
printf("student1 number=%d score=%f\n",num,value);
num = 100;
value = 97.29;
printf("student2 number=%d score=%f\n",num,value);
}

//修改后
int main(){
int num=10;
float value=96.3;
printf("student1 number=%3d score=%5.2f\n",num,value);
printf("student1 number=%-3d score=%5.2f\n",num,value);
num = 100;
value = 97.29;
printf("student2 number=%3d score=%5.2f\n",num,value);
}
1
2
3
4
5
6
7
student1 number=10 score=96.300003
student2 number=100 score=97.290001

//修改后
student1 number= 10 score=96.30
student1 number=10 score=96.30
student2 number=100 score=97.29

注:

  1. 使用%3d,表示默认占3个位置
  2. 使用%-3d,表示左对齐,默认不带’-'表示 右对齐
  3. 使用%5.2f,表示默认占用5个位置,保留2为小数

1.4 进制转换

1
2
3
4
5
6
int main(){
int i = 123;
printf("%d\n",i);
printf("%o\n",i);
printf("%x\n",i);
}
1
2
3
123
173
7b

1.5 scanf函数

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main(){
int i;
char c;
scanf("%d", &i);
printf("i=%d\n",i);
scanf("%c",&c);
printf("c=%c\n",c);
}
1
2
3
4
10
i=10
c=

注意:
1. 运行后仅在第一个scanf进行了阻塞,即输入值 赋给 i
2. 为什么第二个scanf没有阻塞?因为当第一次scanf时,输入10,敲下回车后,scanf在读取过程中,输入缓冲区存值为10\n,scanf设置为%d将读取该缓冲区内的整形即10,当步过第一scanf后输入缓冲区的值为\n而scanf函数在读取int、float、str时会忽略'\n'、空格(忽略指scanf函数执行时会首先删除这些字符,再阻塞),所以在第二个scanf使用%c会直接读取缓冲区的换行符\n,导致输出c为换行
3. 解决方式:getchar()消耗输入缓冲区中的换行符或空字符串