初入C语言殿堂,小白的从零开始学代码,旁人勿入(只会浪费你时间)

2024-03-25 13:10

本文主要是介绍初入C语言殿堂,小白的从零开始学代码,旁人勿入(只会浪费你时间),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先介绍一下游戏背景:一个肥宅,怒闷的问自己为什么没有女生看得上为什么出生没有含着金钥匙为什么自己一无是处,于是他走上了攀登C语言圣山的无尽旅途…

第一篇:新手村:一望无际的C圣殿山顶。

一.新手大礼包

或许是前世转世给造物主充了钱,肥宅还未踏入新手村就在路上捡到了大礼包。他打开一看,哇,暴率是真的高:


转义字符

\0为字符串的结束标志,\t为空格 \ddd 为1~3个八进制的数字()。xdd为2个十六进制的数字,\'为输出单引号,\"为输出双引号。

例子:

printf("%d\n", strlen("c:\test\328\test.c"));

结果输出14。分析:共{'c', ':', '\t', 'e', 's', 't', '\328', '\t', 'e', 's', 't', '.', 'c', '\0'}共14个字符

循环语句

判断语句内为执行语句时,先执行,然后判断执行语句所操作的值(个人理解为左值优先,没有左值判断右值(虽然C语言好像没有右值概念))是否为0
例子:

int i = 0;
int k = 0;
for(i = 0, k = 0; i++, k++)k++;
...

for循环执行了0次,因为中间为判断语句,先执行再判断,将k值赋0后,判断k的值是否为0,为0则跳出循环。这一段代码中k一直都是0,没出生过(bushi)。
这又带来了一个问题,如果判断语句中写一个没有返回值的函数,它会如何做判断呢?使用C++(QT)试了试,结果如下
在这里插入图片描述

生成随机数

生成随即数的函数int rand(void),来自头文件<stdlib.h>,需要void srand(unsigned inte seed)先设置随即生成函数的规则,输入不随程序影响,一直变换的值就能得到随机数(比如时间戳)

system函数

system()括号内跟shell命令等同于跟系统终端输入命令

strcmp函数

bool strcmp(char a, char b)比较a,b是否相同,相同返回0

goto语句

例子:

n:...;
goto n;

goto语句不能跨函数跳转。

对于多重循环要一次性跳出多个循环的时候才显的好用(其他时候不该用(不然你的领导会吃了你的)):

for(...){for(...){for(...){...if(disater)goto error;}}...error:if(disater)//处理错误情况
}

字符数组初始化

char arr1[] = "abc";为字符串初始化,最后会有\0字符,所以初始化为4字符数组,最后一个值为\0

char arr2[3] = {'a', 'b', 'c'};为传值初始化,传入3个字符参数,所以初始化为3字符数组。

查看地址值可以用%p参数,例如 printf("&arr[%d] = %p\n", i, &arr[i]);

数组名的地址值是什么

void arr(int arr[]){int sz = sizeof(arr) / sizeof(arr[0]);printf("%d", sz); //1
}
int main(){int arr[10];int sz = sizeof(arr) / sizeof(arr[0]);printf("%d", sz); //2arr(arr);
}

1处打印值为1,2处打印值为10。为什么会有不同?:

int sz = sizeof(arr) / sizeof(arr[0]);中,sizeof(arr)中的arr不同与一般理解!arr表示的是整个数组的指针,除此之外只有&arr也是这样,可以这么说,&arr + 1 - arr[0]为10个元素类型长度的值而非1个。所以sizeof(arr)没有问题。

问题在与函数声明的型参上。arr(int arr[])本质上和arr(int* arr)一样为指针类型,因此在sizeof()中不认为是数组类型,因此只返回一个元素的大小。而在主函数中arr定义为数组,所以能打印出正确的值。(型参可以改为arr(&int arr[])这样在函数内部也能认为是数组)(存疑)

算术操作符中%的规则

例如 10%3符号两边必须为整数,不能是浮点数,返回取余后的值,操作的是二进制位

移位操作符号 << 、 >>

左移右移右边的值都只能是正整数,负数没有定义

左移操作符 <<

左边抛弃,右边补0,不赋值不会使变量发生变化。

右移操作符 >>

有两种方式,取决于编译器

第一种算术右移,左边补原来位数的值(1则补1,0则补0),右边抛弃

第二种逻辑右移,左边补0,右边抛弃

位操作符

如何仅用位操作符来完成两个数的交换
a = a ^ b;
b = a ^ b;
a = a ^ b;

可以这样来理解:

b = a ^ b即为b = (a') ^ b = a ^ b ^ b = a ^ (b ^ b) = a

a = a ^ b即为a = (a') ^ (b') = (a ^ b) ^ (a) = b ^ (a ^ a) = b

相关练习(巩固)

判断整数(32位)有多少个二进制位1,高级做法:(不明觉厉啊!)

whil(num){++count;num &= (num - 1);
}

num &= (num - 1)相当于做了判断二进制数组中最靠右的1在哪里同时去掉了比这个1更右的位数(左补齐0),进而循环判断num就能通过循环次数得出结果。

单目操作符

~对一个数的二进制位按位取反

++a (–a) 先a’=a+1,后b=a’,另一种理解为return(a+1)

a++ (a–) 先b=a, 后a=a+1,另一种理解为return a, a=a+1;

sizeof是操作符,可以sizeof int但是对于struct student不适用,因为sizeof优先级很高

逻辑操作符中的特例

&& 若左边为0,右边全忽视(当然要考虑到符号执行顺序的问题)

|| 若左边为1,右边全忽视

逗号操作符号,

…,…,…;这条语句最后返回的结果为最后执行(即最后一个小语句)的结果。

算术表达式中的强制转换

整形提升

按照最高位的符号位(0或1)来提升(左补齐),不足整形提升为整体(长度)。

只要参与了表达式运算(包括逻辑运算),就会发生 整形提升

寻常算术转换

赋值时,赋值前的变量会尝试转换为赋值后的。

计算时,底精度的会转换成高精度的。(有符号数比无符号数精度底)

操作符的执行顺序

对于考操作符的题目,就尽量按照 顺序,结合性,是否改变操作性来判断,只要结果相等,不需要完全的判断唯一路径。

但对于写代码时,不要写不能确定唯一路径的算式

例子 a * b+c * d+e * f 这样只根据三原则定理是无法判断出唯一路径的

指针的大小

在32位系统为4字节,64位系统为8字节

指针类型的意义

不同的指针类型的步长是不一样的(*p+1),这意味着不同类型的指针能操作的字节空间数的权限是不一样的。字节是地址,但对于递归时的指向性(下一个地址值指向哪里)是有指针类型决定的

指针减去指针

前提是指针类型一致且处在同一块连续的空间(比如数组)

返回相隔元素的个数(可以小指针减大指针,为负数)

另:标准规定,对于比较而言,可以允许与数组最后一个元素的指针的后一个元素(指针尾)进行比较,而对于第一个元素的指针的前一个指针则没允许的规定

结构体的声明

三步走:

typedef struct Stu{int num;char name;
}Stu; //后可跟初始化,例如: = {1,"richard"}

定义:

struct Stu p1; // 初始化使用大括号

结构体传参最好传结构体指针


肥宅这真是捡到宝,拿着这个包直接闭关,十年之后又是一条好汉!

这篇关于初入C语言殿堂,小白的从零开始学代码,旁人勿入(只会浪费你时间)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845117

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码