一、笔记
1.C语言程序的基本结构
预处理指令:通常放在程序的开头,#include <stdio.h> 。预处理器指令以#字符开始,最常见的#include,用于包含其他的头文件。
函数:程序中至少包含一个函数,即main()函数。main()函数是程序执行的起点。一个C程序中可以包含其他的函数,这些函数可以自己定义也可以是从库中调用。
变量:变量用于存储数据。在C语言中,每个变量都有特有类型。
语句和表达式:语句是执行特定任务的语句,如赋值语句、调用函数等,表达式则是计算产生值的计算公式。
注释:注释用于解释程序的功能,对代码进行解释和描述。注释可以用/* */或者// 来书写。
2.gcc命令
编译命令:gcc 文件
运行命令:./ 文件
如果有多文件交叉使用,需要将多个源文件一起编译
例如 gcc 1.c 2.c 3.c -o test
警告:某些警告在一定程度上可以忽略,不会影响文件的输出
错误:错误必须全部解决,编译器才可以对源码进行编译
gcc 编译流程
预处理 处理程序的头文件展开、宏定义替换、删注释等内容,生成.i文件
gcc -E hello.c -o hello.i
编译 检查代码的规范性,是否有语法错误,将代码翻译成汇编语言;生成 .s文件
gcc -S hello.i -o hello.s
汇编 将.s文件转换成二进制目标文件,生成.o文件
gcc -c hello.s -o hello.o
链接 将程序中所用到的库加载到代码中,生成最终的可执行文件
gcc hello.o -o hello
3.数值型数据的表达形式
二进制
逢二进一,每一位上的数字范围:0/1
八进制
逢八进一,每一位上的数字范围:0-7
十进制
逢十进一,每一位上的数字范围:0-9
十六进制
逢16进一,每一位上的数字范围:0-9,A-F对应10-15
进制转化表

4.原码、反码、补码
源码 十进制正常转换 二进制 后的 数值
反码 十进制 的取反 符号位 不变
补码 反码 + 1
5.数据类型
整型
字符型 char 1字节
整型 int 4字节
短整型 short int 2字节
长整型 long int 8字节
无符号 unsigned
浮点型
单精度浮点型 float 4 字节
双精度浮点型 double 8 字节
长浮点型 long double 16字节
sizeof( ) 用于测量变量空间大小
6.常量分类和声明
整形常量
二进制 0b 无 0b1010
八进制 0 %#o 024
十进制 无 %d 131
十六进制 0x %#x 0xDB4
浮点常量 小数
字符常量 ' A '
#define 宏定义
#dedine 常量的常量名 替换语句 如 #define MAX_SIZE 255
const 修饰符
可以修饰变量为常量,同时在进行声明变量的时候,可以让变量在执行的过程中 不被改变
#define 是无脑替换
const 只能用于修饰变量 让变量成为常量
#define 没有在 ==栈区== 创建空间
const 创建的空间 ,空间大小由常量类型决定
7.运算符

算数运算符
int a = 10;
int b = 20;
printf("a + b = %d\n", a + b); // 30
赋值运算符
int a = 10;
a += 20; // a = a + 20
printf("a = %d\n", a); // 30
关系运算符
int a = 10;
int b = 20;
printf("a > b: %d\n", a > b); // 0 (false)
printf("a < b: %d\n", a < b); // 1 (true)
printf("a >= b: %d\n", a >= b); // 0 (false)
printf("a <= b: %d\n", a <= b); // 1 (true)
printf("a == b: %d\n", a == b); // 0 (false)
printf("a != b: %d\n", a != b); // 1 (true)
逻辑运算符
&& : 当两边的操作数都为真(非零)时,结果才为真。如果任一操作数为假(即零),结果就为假
|| : 只要两个操作数中的任一操作数为真,结果就为真。只有当两个操作数都为假,结果才为假
! : 这是一个单目运算符,对值进行取反操作。如果操作数为真,结果为假,反之亦然
& : 果两个相应的二进制位都为1,则结果为1,否则为0
| : 如果两个相应的二进制位中至少有一个1,则结果为1,否则为0
^ : 相同为0 不同为1
~ : 对数的每一位取反,0变1,1变0。
<< : 把位向左移动指定的位数,右边用0填充。
>> : 把位向右移动指定的位数,左边的空位如何填充取决于数字的符号 如正数左边填充0,负数左边填充1
指针运算符
* : 解引用运算符 这个运算符返回指针所指向的值
& : 取地址运算符 这个运算符返回变量的内存地址
++ -- : 自增和自减运算符 :这些运算符用于改变指针的值,使其指向下一个或上一个内存位置
8.sizeof 运算符
用于获取一个特定类型或特定对象的大小(以字节为单位)。其可以应用于任何数据类型,包括基本类型(如int、char、double等)、派生类型(如数组、指针等)和自定义类型(如结构体、联合等)
9.格式符号


二、作业
1. 通过位操作 操作一个 32 位的数据对其进行如下操作
一次性操作两位 对 这个32位数据中的 5位 和 6位 变成11
一次性操作两位 对 这个32位数据中的 7位 和 8位 变成10
一次性操作两位 对 这个32位数据中的 9位 和 10位 变成01
一次性操作两位 对 这个32位数据中的 11位 和 12位 变成00
#include <stdio.h>
int main(int argc, char const *argv[])
{
unsigned int i = 0;
i |= (3 << 5);
i |= (2 << 7);
i |= (1 << 9);
i &= ~(2 << 10);
printf("i =%d\n", i);
return 0;
}

2. 写一个小的登录功能
用户可以循环登录 例如输入错了一次密码 可以在进行输入
用户只能输错 3 次 3次后自动退出程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char i[20] = "0";
char p[20] = "0";
char name[128] = "张三";
char password[128] = "123";
int j = 0;
while(j < 3)
{
printf("输入姓名:");
scanf("%s", &i);
printf("输入密码:");
scanf("%s", &p);
if((strcmp(name, i) == 0) && (strcmp(password, p) == 0))
{
printf("登录成功\n");
break;
}
else
{
if((!strcmp(name, i) == 0) || (!strcmp(password, p) == 0))
{
printf("输入错误\n");
j++;
}
}
}
if(3 == j)
{
printf("登录失败\n");
}
return 0;
}



81




被折叠的 条评论
为什么被折叠?



