初入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); //2
    arr(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; // 初始化使用大括号

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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
第一篇 JavaScript门篇 第1章 初步了解JavaScript 1.1 JavaScript是什么 1.2 JavaScript能做什么 1.2.1 表单数据合法性验证 1.2.2 页面特效 1.2.3 交互式菜单 1.2.4 动态页面 1.2.5 数值计算 1.3 JavaScript编程起步 1.3.1 “Hello World!”程序 1.3.2 选择JavaScript脚本编辑器 1.4 如何引JavaScript脚本代码 1.4.1 通过<script>与</script>标记对引 1.4.2 通过<script>标记的src属性引 1.4.3 通过JavaScript伪URL引 1.4.4 通过HTML文档事件处理程序引 1.5 嵌JavaScript脚本代码的位置 1.5.1 在<head>与</head>标记对之间放置 1.5.2 在<body>与</body>标记对之间放置 1.5.3 在两个标记对之间混合放置 1.6 选择合适的浏览器 1.7 处理不支持JavaScript脚本的情况 1.7.1 使用<!——和——>标记对直接屏蔽法 1.7.2 使用<noscript>和</noscript>标记对给出提示信息 1.8 本章小结 1.9 本章习题 第2章 JavaScript编程的语言基础 第3章 JavaScript事件处理 第4章 JavaScript基于对象编程 第5章 文档对象模型(DOM) 第6章 String、Math、Array等数据对象 第7章 Window及相关顶级对象 第8章 Document对象 第9章 HTML元素对象 第二篇 JavaScript进阶篇 第10章 正则表达式 第11章 客户端与服务器端通信 第12章 JavaScript与Ajax技术 第13章 JavaScript错误与异常处理 第三篇 JavaScript实例篇 第14章 JavaScript与插件通信 第15章 JavaScript常用特效收集

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值