第2版修订版
第1章 C语言概述
学习C有助于理解C++和C#。
第2章 C语言基本概念
- int 的最大值一般是 21亿+ ,但有些计算机上是 32767
- float 一般只能存储实际值的近似值
- scanf,printf 中的f都是 format的意思
关键字(41个):
- 数据类型(14个)
- char
- short, int, long
- float, double
- const
- enum
- signed
- struct
- typedef
- union
- unsigned
- volatile
- 控制结构(10个)
- if, else
- for, while,do
- continue,default
- goto
- return
- switch
- 其他(17个)
- extern ,register
- inline
- restrict
- sizeof
- static
- void
- _Alignas(C11)
- _Alignof(C11)
- _Atomic(C11)
- _Bool(C99)
- _Complex(C99)
- Generic(C11)
- _Imaginary(C99)
- _Noreturn(C11)
- _static_assert(C11)
- _Thread_local(C11)
字母顺序关键字:
- auto
- break
- case
- char
- const
- continue
- do
- double
- else
- enum
- extern
- float
- for
- goto
- if
- inline, c99引入,内联函数
- int
- long
- register:声明局部变量的关键字,它建议编译器尽可能将变量存储在CPU的寄存器中,以提高变量的存取速度
- restrict,c99引入
- return
- short
- signed
- sizeof
- static:隐藏、保持变量内容的持久性和默认初始化为0
- struct
- switch
- typedef:为已存在的类型创建一个新的名称
- union
- unsigned
- void
- volatile
- _Alignas(C11)
- _Alignof(C11)
- _Atomic(C11)
- _Bool(C99)
- _Complex(C99)
- Generic(C11)
- _Imaginary(C99)
- _Noreturn(C11)
- _static_assert(C11)
- _Thread_local(C11)
练习1:编写一个程序,使用printf在屏幕上显示下面的图形:
*
*
*
* *
* *
*
代码
#include <stdio.h>
int main() {
int i = -4, j = 8; //i,j 用来控制是否打印星号,i=j的时候只打印i,i和j大于零时打印对应位置的星号
while (i <= j) {
for (int k = 0; k <= j; k++) {
if (k == i) { printf("*"); } else if (k == j) { printf("*\n"); } else { printf(" "); }
}
i++;
j--;
}
printf("\n");
return 0;
}
练习2:编写一个计算球体体积的程序,其中球体半径为10m,参考公式 $v=4/3 \pi r^3$ 。注意,分数4/3应写作4.0f/3.0f。(如果分数写成4/3会产生什么结果?)
#include <stdio.h>
#define PI 3.14159265358979323846
double volume(double r) {
return (4.0 / 3.0) * PI * r * r * r;
}
int main(void) {
double r ;
printf("Enter the radius:\n");
scanf("%lf", &r);
printf("the volume is:%f\n", volume(r));
return 0;
}
/*
Enter the radius:
10
the volume is:4188.790205
*/
第3章 格式化输入/输出
- printf格式用%m.pX
- m表示打印的最小宽度,大于该宽度依然会打印出来
- .p中p为小数位数或有效数字(X为g时)
- X表示在数据显示前进行的转换操作
- d:十进制整数
- e:科学计数法
- f:十进制浮点数
- g:显示为指数或者浮点数
#include <stdio.h>
int main() {
int i=1234567890;
double d = 123456789.123456789;
printf("%20d\n", i);
printf("%-20d\n", i);
printf("%25.8f\n", d);
printf("%-25.8f\n", d);
printf("%25.8g\n", d);
printf("%-25.8g\n", d);
return 0;
}
/*
1234567890
1234567890
123456789.12345679
123456789.12345679
1.2345679e+08
1.2345679e+08
*/
不建议用scanf函数,而是读入字符然后转换
第4章 表达式
练习:逆序输出输入的3位数
#include <stdio.h>
int main() {
int d=0;
int i1,i2,i3;
printf("请输入一个三位整数:");
scanf("%d",&d);
printf("逆序三位数:");
i1=d%10;
i2=(d-i1)/10%10;
i3=(d-i1-i2*10)/100%10;
printf("%d%d%d",i1,i2,i3);
return 0;
}
/*
请输入一个三位整数:123
逆序三位数:321
*/
第5章 选择语句
_Bool 只能取值0或1,如果赋值非零值,取值为1.
#include <stdio.h>
int main() {
_Bool flag=5;
printf("%d\n", flag);//1
return 0;
}
stdbool.h头文件定义了如下的宏:
- bool:_Bool
- true:1
- false:0
#include <stdio.h>
#include <stdbool.h>
int main() {
bool b1=true,b2=false;
printf("%d %d\n", b1,b2);//1 0
return 0;
}
第6章 循环
计算常量$e=1+1/1! + 1/2! + 1/3!+…+1/n!$
#include <stdio.h>
double js(long long n) {
long long result = 1;
for (long long i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
double e = 1;
long long js_result;
for (long long i = 1; i <= 22; i++) {
js_result = js(i);
e += 1.0 / js_result;// 分子必须用1.0 而不是1
printf("n=%d\n", i);
printf("阶乘:%lld\n", js_result);
printf("e=%20.19f\n", e);
}
return 0;
}
/*
n=1
阶乘:1
e=2.0000000000000000000
n=2
阶乘:2
e=2.5000000000000000000
n=3
阶乘:6
e=2.6666666666666665186
n=4
阶乘:24
e=2.7083333333333330373
n=5
阶乘:120
e=2.7166666666666663410
n=6
阶乘:720
e=2.7180555555555554470
n=7
阶乘:5040
e=2.7182539682539683668
n=8
阶乘:40320
e=2.7182787698412700372
n=9
阶乘:362880
e=2.7182815255731922477
n=10
阶乘:3628800
e=2.7182818011463845131
n=11
阶乘:39916800
e=2.7182818261984929009
n=12
阶乘:479001600
e=2.7182818282861687109
n=13
阶乘:6227020800
e=2.7182818284467593628
n=14
阶乘:87178291200
e=2.7182818284582301871
n=15
阶乘:1307674368000
e=2.7182818284589949087
n=16
阶乘:20922789888000
e=2.7182818284590428703
n=17
阶乘:355687428096000
e=2.7182818284590455349
n=18
阶乘:6402373705728000
e=2.7182818284590455349
n=19
阶乘:121645100408832000
e=2.7182818284590455349
n=20
阶乘:2432902008176640000
e=2.7182818284590455349
n=21
阶乘:-4249290049419214848
e=2.7182818284590455349
n=22
阶乘:-1250660718674968576
e=2.7182818284590455349
*/
注意n=21时阶乘计算已经溢出。
正文完