c语言学习笔记|编译过程|数据类型|scanf|运算符|选择与循环|指针的传递

Posted Time木0101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言学习笔记|编译过程|数据类型|scanf|运算符|选择与循环|指针的传递相关的知识,希望对你有一定的参考价值。

目录

1.编译过程

一个项目编译为可执行文件:main.c>>main.obj>>main.exe

2、链接:函数符号会替换为实际的函数入口地址
3、链接错误大多函数符号写错
C语言提供了13种运算符

2.数据类型


1、关键字
2、常量:运行过程中,其值不能被改变

注:字符型单引号内只能由一个字符
2、变量:在程序运行期间,这些值在程序运行的执行过程中是可以改变的
命名规则:只能由字母、数字和下划线三种字符组成,且第一个字符必须是字母或下划线。
注:变量名不能和关键字重名

3整形数据
进制:
不同进制赋值:
i=0x127b;//十六进制
i=0173;//八进制
补码:负数用补码存储
整型变量:(括号内内容为可选)

注:避免溢出

4浮点型数据
两种形式:

浮点型变量:
浮点数的精度控制,浮点型变量分为单精度((float型)、双精度( double型)和长双精度型(long double)三类形式。如下表所示,因为浮点数使用的是指数表示法,所以我们不用担心数的范围,以及去看浮点数的内存(自己算起来麻烦),我们需要关注的是浮点数的精度问题,例如我们赋给a的值为1.23456789e10,加20后,应该得到的值为1.234567892e10,但是却是1.23456788e10,变的更小了,我们把这种现象称为精度丢失,原因就是float 能够表示的有效数字为7位,最多只保证1.234567e10的正确性,如果要达到正确,我们需要把a和b均改为double类型。
注:防止精度丢失(后可用数组解决)

判断浮点数是否相等:

王者荣耀计算小数用的是分数以提高效率

5字符型数据
用单引号包含的一个字符是字符型常量,且只能包含一个字符,下面是例子示范,以“\\”开头的特殊字符称为转义字符,转义字符用来表示回车,退格等功能键。

GBK 一个汉字2个字节
utf-8 3个字节

字符串常量:双引号括起来的字符序列


混合运算:
数值按int运算:
数值按4个字节进行运算
浮点常量默认按double类型运算

3.scanf

1、scanf
原理:
标准输入缓冲区原理
阻塞:即等待输入,这里没有等待第二次输入直接输出

//scanf %d %f忽略空格和\\n
这里会阻塞,等待输入

可加:

缓冲区是一段内存空间,分为读缓冲,写缓冲,C的缓冲三种特性。

多种类型混合输入:

getchar:等价于char c;scanf(“%c”, &c)
语法格式:
int getchar(void);

putchar©;等价于printf(“%c”, c);
语法格式:
#include <stdio.h>
int putchar( int ch);

printf()
左对齐:
例子:

4.运算符

语言提供了13种运算符

1,算术运算符
2,关系运算符
关系运算符的优先级低于算数优先级
少用括号,括号太多增加代码阅读难度
注:若if(4<i<10)
则计算机会先判断4是否小于i,若4小于i则4<i部分变为1再与10相比,反之为0后同理。
非数学上理解i是否在其之间。所以需要用逻辑运算符
3,逻辑运算符
!(逻辑非)优先级高于算术运算符,&&(逻辑与)和||(逻辑或)优先级低于关系运算符。
短路操作:代替if




4,位运算符

左移,右移,按位取反,按位或,按位异或,按位与
移位的效率高于乘除法。
(1)左移:高位丢弃,低位补0,相当于乘2.。
申请内存会用到:申请1G:malloc(1<<30)

(2)右移:
对于偶数来说是除2,对于奇数是先减1再除2.
低位丢弃,正数高位补0,负数高位补1.
无符号数当做正数。

(3)按位与,按位或,按位取反
对应位置进行与,或,取反
取反:任意正数的取反为其负数减1
若要得到一个数的最小位为1的数。可和他的相反数按位与最后得到的数就是了。

(4)异或(相同为0,相异为1)
任何数和自身异或得0
任何数和0异或得自身
满足交换律

a、两个数有两个不同空间可用异或交换互相的值:
i=i^j
j=i^j
i=i^j

b、101个数,50个出现两次,1个出现一次找出出现一次的数
举例5个数

c、102个数,50个出现两次,2个出现一次找出出现一次的数
分堆,为1的最小位

d、103个数,50个出现两次,3个出现一次找出出现一次的数

5,赋值运算符
左操作符=右操作符

6,条件运算符与逗号运算符
条件运算符是C语言唯一的三目运算符,代表有三个操作数。
max=a>b?a:b //max等于a和b较大的值

逗号运算符:(优先级最小)(逗号表达式的整体的值是逗号后面的值)
a=b,c //a等于b
a=(b,c) //a等于c

for(i=1, j=2, k=3;i<100;i++,j++)

7,自增自减运算符及字节运算符
j=++i //i先++在赋值给j
j=i++>1 //后++,等价于j=i>1-1;i++,最先的是判断i与1的大小
函数传递参数禁止使用自增自减

sizeof() 是一个判断数据类型或者表达式长度的运算符。

课外知识:百兆光纤指的是100M的bit

5.选择与循环

算术运算符优先级高于关系运算符,关系运算符优先级高于逻辑与与逻辑或,相同优先级运算符从左至右进行结合
选择:
if:
基础形式:

进阶:

switch:
switch中不能写浮点型的表达式

#include <stdio.h>
#include <stdlib.h>

int main()

	int mon,year;
	while(scanf ("%d%d", &year, &mon)!=EOF)
	
		switch (mon)
		
		case 2:printf("%d is %d days\\n" , mon,28+(year%4==0&&year%100!=0||year%400==0)); break;
		case 4:
		case 6:
		case 9:
		case 11 : printf ("%d is 30days \\n" , mon) ; break;
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12: printf ("%d is 31days \\n" , mon) ; break ;
		default:
			printf ("error mon\\n") ;
			break ;
		
	

测试:

循环:
break结束循坏_
continue本次循环,continue后面的语句不再执行

goto无条件跳转:
1加到100:

#include <stdio.h>
#include <stdlib.h>
int main()

	int i=1, sum=0;
lable:
	sum+=i;
	i++;
	if(i<=100)
	
		goto lable;
	
	printf ("sum=%d\\n", sum);

while:
/ while循环内没有使条件趋近于假的语句
1加到100

#include <stdio.h>
#include <stdlib.h>

int main()

	int i, sum;
	i=1, sum=0;
	while(i<=100)
	
		sum+=i;
		i++;
	
	printf ("sum=%d\\n", sum);

do while:
1加到100

#include <stdio.h>
#include <stdlib.h>

int main()

	int i, sum;
	i=1, sum=0;
	do
		sum+=i;
		i++;
	while(i<=100);
	printf ("sum=%d\\n", sum);

for:
1加到100:

#include <stdio.h>
#include <stdlib.h>

int main()

	int i, sum;
	for(i=1,sum=0;i<=100;i++)
	
		sum+=i;
	
	printf ("sum=%d\\n", sum);

偶数和:

#include <stdio.h>
#include <stdlib.h>

int main()

	int i, sum;
	i=1,sum=0
	for(;i<=100;i++)
	
		if(i%2==1)
		
			continue;
		
		sum+=i;
	
	printf ("sum=%d\\n", sum);

都可省略:(尽量都不要省略)

#include <stdio.h>
#include <stdlib.h>

int main()

	int i, sum;
	i=1,sum=0
	for(;;)
	
		if(i<100)
		
			sum+=i;
			i++;
		else
			break;
		
	
	printf ("sum=%d\\n", sum);





6指针的传递

指针:把对应某个变量的地址存下来

指针的定义:
内存区的每一个字节有一个编号,这就是“地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。按变量地址存取变量值的方式称为“直接访问”方式,例如 printf(“%d”,i);scanf(“%d”,&i);另一种存取变量值的方式称为“间接访问”的方式。即,将变量i的地址存放在另一个变量中。在C语言中,指针变量是一种特殊的变量,它是存放地址的。

定义一个指针变量:


取地址与取值操作符:
取地址操作符是&,也叫引用,通过该操作符我们可以获取一个变量的地址值;取值操作符为*,也叫解引用,通过该操作符我们可以拿到一个地址对应位置的数据。

注意:


5.2指针使用场景:
5.2.1指针的使用场景两个传递与偏移。
传递:
不用指针
值传递
i前后仍旧是10

用指针:
前后值改变:
变量地址的传递

更多大学课业实验实训可关注公众号:Time木
回复相关关键词
学艺不精,若有错误还望指点

以上是关于c语言学习笔记|编译过程|数据类型|scanf|运算符|选择与循环|指针的传递的主要内容,如果未能解决你的问题,请参考以下文章

efffective Objective-C 学习笔记

C语言中利用scanf语句输入多个值的问题

C语言学习笔记--条件编译

嵌入式开发gcc 学习笔记 - 编译C程序 及 编译过程

C语言笔记3-scnf

编译原理学习笔记