最近开始接触C语言,虽然只是初步了解,初步掌握其概念。通过学习,了解到C语言包含变量、常量、循环变量、指针变量、结构体等核心元素,以及基本的编程逻辑。现在结合记忆和已编写的代码进行复习巩固。
"\n"//表示换行,毋庸置疑是初学者接触和使用最多的
"\t"//表示水平制表符,Tab键==四个空格,写代码的时候编译器会自动的美化空格,制表符在调试字符间的空隙还是很方便的
"\a"//表示警报,电脑会发出蜂鸣声,这个就是太奇葩了导致我就见过一眼就忘不掉了
// 警报应用示例(慎用)
printf("\a检测到异常温度!"); // 触发主板蜂鸣器
"\ddd"表示八进制的,1~3位的八进制数字
"\xdd"表示十六进制,两位十六进制的数字
"\?"//表示防止被认为是特殊字符,老编译器里面可能会有三个字符构成的特殊键,为了防止?和别的字符劈腿
"\"//就一个光的表示制表符,例如想打印printf(“helloworld!”);
==printf("printf(\"hello wold!\");");
"\r"//回车符,用于将光标移动到当前的开头
"\b"//退格符将光标往回退一个字符的位置
"\f"//换页符,我现在还没遇到过并不是很清楚
算术、运输符:
7 % 4; // 求余 → 3(钟表循环的数学本质)
7 / 4; // 整型除法 → 1(丢失精度的现实隐喻)
7.0 / 4; // 真除法 → 1.75(类型提升的智慧)
5/4,当想取到小数的时候,可以在运算数里加上小数,5.0/4 == 1.25 or 5/4.0 == 1.25
与(AND):&&,当两个操作数都为真时,结果为真
或(OR):||,当至少一个操作数为真时,结果为真
非(NOT):!,对操作数取反,真变假,假变真
在 C 语言中,EOF 是一个宏定义,通常值为 -1,用于表示文件结束
"|"按位或:在二进制操作中,| 用于对两个数的每一位进行或操作。只要两个对应位中有一个为1,结果位就为1
eg:a = 5 # 二进制 0101
b = 3 # 二进制 0011
result = a | b # 结果为 0111,即 7
print(result) # 输出 7
getchar(),获取ASCII码数值
putchar(),打印数字对应的ASCII码的字符
//一般变量都是用 int表示,因为ASCII码都是整数对应储存字符,即使使用的时char定义的变量,在getchar()都会强制提升至整型。
//我之前一直都把字符和数字分得很清楚,但在编程的时候,char 同样可以定义数值,打印也可用%s,但int则不可以转化位字符类型
//还有关于打印,到底用那个,整型用"%d","%4d"则表示打印或者读取几个整数,%02d就是为了防止月份为一位数时,在前面补上一个零。
//eg://输入 20051212.输出//year: month: date:
int y = 0,m = 0,d = 0;
scanf("%4d %2d %2d",&y, &m, &d);
printf("year:%d month:%02d date:%02d",y,m,d);
//还有关于打印printf(),要明确类型
我就在double和float之间卡了很久,double是默认double=0.0;初始化用%lf打印
而float用float=0,0f;初始化,用%f打印,要打印几位小数就加.数。
eg:"%.2f"此为打印两位小数,double同理。
while()循环挺神的,如单细胞变成多细胞后引发质变带来的思维一样,正如《算法导论》里的"循环不变式是理解迭代的钥匙。" 下面是极值优化。"
极值算法优化
int arr[] = {0};
int i = 0;
while (i<4)
{
scanf("%d",&arr);//scanf的读取规则和getchar一样都是读取缓冲区的信息,以空格为分隔符,21_312就为三个值,分别为21,_,312,读取也就读一个。
i++;//输入这种一大串的又分单个的值,可直接用这个循环来解决
}
int max = arr[0];
i = 1
while(i<4)
{
if(arr[i] > max)
max = arr[i];
i++;
}
printf("%d",max);
当有continue,在循环语句时,结果为真返回该函数,当遇到break,判断结果为真,直接结束该函数,向下进行
我印像挺深刻的就是static:
// 文件内私有函数
static void internal_logging() { /* 日志实现 */ }
// 持久化计数器
void counter() {
static int count = 0; // 突破作用域限制
count++;
}
// 模块内部全局变量
static int cache_size = 0; // 隐藏实现细节
C语言的编程逻辑:定义变量的大小,就为变量的大小,如sizeof(int)//输出4,那么用int定义的变量都为4个字节;如int* p指针变量的定义,变量对象指向 int 类型的指针变量,指针变量本质就是存放地址的位置,32位电脑的指针变量就为32bit=4byte,因为一个地址用四个字节来表示,所以为4字节,而电脑为64位的同理,变量大小为8byte。
#include <stdio.h>
int main() {
/* 类型即契约:
int类型承诺4字节存储空间
(根据C标准为至少2字节) */
printf("int size: %zu\n", sizeof(int)); // 典型输出4
/* 指针的哲学本质:
地址的容器,容量由系统架构决定 */
int* p;
printf("pointer size: %zu\n", sizeof(p)); // 32位系统输出4,64位输出8
}
演示32位的系统
变量int a = 42在内存中的存在形式:
+---------+---------+---------+---------+
| 字节1 | 字节2 | 字节3 | 字节4 | ← 4字节空间
| 00101010 00000000 00000000 00000000 | ← 二进制存储
+---------+---------+---------+---------+
地址: 0x7ffd1234
同一源文件下的函数是可以直接调用的,如我在1.c文件里的函数,可在同源下的2.c直接使用,不用再去创建函数,先声明(extern int add(a,b))在这个extern可以类比成头文件,例如<stdio.h>,不过头文件不只有函数的声明还
// math_util.c
int add(int a, int b) {
return a + b;
}
// main.c
extern int add(int a, int b); /* 声明契约:承诺存在此函数实现 */
int main() {
printf("3+5=%d\n", add(3,5)); // 链接器负责地址绑定
return 0;
}
总结:
-
模块法则:头文件应当如玻璃般透明,源文件应当如黑盒般密封
-
编译哲学:分离编译如同社会分工,链接过程如同商业合作
-
类型思维:每个变量声明都是与编译器的契约,不可背弃
指针和和结构体,对于小白的我来说,还没什么储备的知识,在这里就不做总结了。