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木
回复相关关键词
学艺不精,若有错误还望指点

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Time木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值