目录
进制转换详解
1. 进制转换方法
1.1 二进制转十进制
- 例子:
110101
=2^0 + 2^2 + 2^4 + 2^5
=53
- 方法: 对于每一位,如果该位是
1
,则计算2
的该位置次方的值并累加。
1.2 十进制转二进制
- 例子:
53
=32 + 16 + 4 + 1
=0011 0101
- 方法: 将数字拆分为
2
的幂次方的组合。
1.3 二进制转八进制
- 例子:
110101
=065
- 方法: 每三位二进制数转换为一位八进制数(使用
421
规则)。
1.4 二进制转十六进制
- 例子:
00110101
=0x35
- 方法: 每四位二进制数转换为一位十六进制数(使用
8421
规则)。
1.5 八进制转二进制
- 例子:
065
=110101
- 方法: 同二进制转八进制的逆过程。
1.6 十六进制转二进制
- 例子:
0x65
=0011 0101
- 方法: 同二进制转十六进制的逆过程。
2. 进制简介
- 二进制: 使用
1
和0
表示的数制。 - 八进制: 前面通常加
0
,用以区分其他进制。 - 十进制: 日常生活中常用的阿拉伯数字系统。
- 十六进制: 前缀通常是
0x
,用于表示计算机系统中的数据。
特别注意
- 十六进制和八进制直接转换: 直接在两者之间转换没有简单的一对一映射方法,通常需要先转换为二进制作为中介。
C语言基础元素概览
1. 关键字分类
1.1 存储类型关键字
static
auto
extern
register
1.2 数据类型关键字
int
char
float
short
long
double
signed
unsigned
1.3 构造类型关键字
struct
union
enum
1.4 控制结构关键字
- 选择结构:
if
if else
if else if
- 循环结构:
for
while
do...while
1.5 其他关键字
void
typedef
const
volatile
(防止编译器优化)return
sizeof
2. 运算符
2.1 算术运算符
- 加法:
+
- 减法:
-
- 乘法:
*
- 除法:
/
- 取模:
%
- 自增:
++
- 自减:
--
2.2 逻辑运算符
- 与运算:
&&
- 或运算:
||
- 非运算:
!
2.3 位运算符
- 位与:
&
- 所有位全为1才为1,否则为0
- 位或:
|
- 只要有一个位为1,则结果为1
- 异或:
^
- 相同位为0,不同位为1
- 按位取反:
~
- 如
~(-14)
结果为-15
- 右移:
>>
- 右移几位,在左边补0
- 左移:
<<
- 左移几位,在右边补0
2.4 条件运算符
(条件式 ? 表达式1 : 表达式2)
- 示例:
(a < b) ? a : b
2.5 赋值运算符
+=
-=
*=
/=
%=
特别注意:
%
用于取余,仅适用于整数。++a
先自增后使用,a++
先使用后自增。- 示例:
int a = 5; int b = ++a; // b=6
int a = 5; int b = a++; // b=5
%的例子:
判断个十百千位 int a = 2345; int b = a/1000; printf("千位是:%d\n",b); int c = a/100%10; printf("百位是:%d\n",c); int d = a/10%10; printf("十位是:%d\n",d); int e = a%10; printf("个位是:%d\n",e);
练习:水仙花
int n, a, b, c; for(n=100;n<1000;n++) { a = n / 100; b = n % 100 /10; c = n % 100 %10; if(pow(a,3)+pow(b,3)+pow(c,3) == n) { printf("%d\n",n); } }
变量与常量
3. 变量格式与分类
3.1 变量声明格式
- 格式: 存储类型 数据类型 变量名
- 示例:
int a;
3.2 数据类型分类
- 整型:
int
,short
,long
- 字符型:
char
- 浮点型:
float
,double
3.3 全局变量与局部变量
- 区别:
- 作用域: 全局变量在所有函数中都可访问;局部变量只在其定义的函数或代码块中可见。
- 生命周期: 全局变量在整个程序运行期间存在;局部变量在其所在函数调用结束后销毁。
- 存储地址: 全局变量存储在静态区;局部变量存储在栈中。
- 初值: 全局变量默认初始化为0;局部变量不自动初始化,除非明确指定。
- 定义位置: 全局变量定义在所有函数外部;局部变量定义在函数内部或代码块内。
输入与输出
4. 输出格式说明
%d
: 整型%c
: 字符%f
: 浮点型%s
: 字符串%p
: 地址%#0
: 八进制%#0x
: 十六进制%-m.n
: 格式化输出%e
: 指数形式
4.2 垃圾字符处理
getchar()
: 读取并丢弃一个字符,常用于清除输入缓冲区中的多余字符,如空格、换行等。- 用途: 在读取数值后,清除输入流中的空白字符,避免影响后续输入。
4.3 输入操作
scanf()
: 格式化输入函数,用于读取用户从键盘输入的数据。
- 格式:
scanf("%类型", &变量名);
或者直接使用数组名。
getchar()
: 读取并返回一个字符的ASCII码值。
- 功能: 从标准输入设备(如键盘)读取一个字符。
- 参数: 无。
- 返回值: 输入字符的ASCII码值。
特别注意:垃圾字符处理
- 在进行多次输入时,前一次输入的结束符(如换行符)可能残留在输入缓冲区中,影响下一次输入。使用
getchar()
或scanf()
的特定方式可以清除这些“垃圾”字符。
// while (1) // { // int i = 0; // int j; // int num1 = 0; // int age = 18; // char a; // for (i = 1; i <= 3; i++) // { // printf("请猜一个数�?:\n"); // scanf("%d", &j); // if (j == age) // { // printf("猜对�?"); // break; // } // else // { // printf("�?%d次输入错误\n", i); // num1++; // } // } // if (num1 == 3) // { // printf("请问你是否还像继�??(继续请按Y或y,退出请按N或n)\n"); // getchar();// 注意垃圾字符! // scanf("%c", &a); // if (a == 'Y' || a == 'y') // { // continue; // } // else if (a == 'N' || a == 'n') // { // break; // } // } // return 0; // }
控制流程结构
5. 分支语句
5.1 if...else
- 语法:
C
1if (条件表达式) { 2 // 条件为真时执行的代码 3} else { 4 // 条件为假时执行的代码 5}
5.2 if...else if...else
- 语法:
C
1if (条件表达式1) { 2 // 条件1为真时执行的代码 3} else if (条件表达式2) { 4 // 条件2为真时执行的代码 5} else { 6 // 上述条件都不满足时执行的代码 7}
5.3 switch
- 语法:
C
1switch (表达式) { 2 case 常量表达式1: 3 // 当表达式的值等于常量表达式1时执行的代码 4 break; 5 case 常量表达式2: 6 // 当表达式的值等于常量表达式2时执行的代码 7 break; 8 default: 9 // 当上述case都不匹配时执行的代码 10}
6. 循环语句
6.1 for
循环
- 语法:
C
1for (初始化表达式; 条件表达式; 更新表达式) { 2 // 循环体 3}
6.2 while
循环
- 语法: C
1while (条件表达式) { 2 // 循环体 3}
- 注意: 条件表达式为非零值时,循环将继续。
6.3 do...while
循环
- 语法:
C
1do { 2 // 循环体 3} while (条件表达式);
6.4 死循环
- 示例:
C
1while (true) { 2 // 无限循环体 3}
C
1for (;;) { 2 // 无限循环体 3}
7. 循环控制语句
7.1 break
- 功能: 立即终止当前循环,跳转至循环之后的代码。
7.2 continue
- 功能: 跳过本次循环剩余的部分,立即开始下一次迭代。