【一头扎进大沙漠---初识C语言】 入门级,超详细


你好,这是我近期关于C语言的学习和知识点总结,会持续更新,欢迎指正,欢迎交流,希望也能给你起到参考作用,我们一起学习,一起进步!

C语言的常见概念

提到C语言我们可能会想到很多,它的发展史,它的地位,它的概念,它的作用等等,我认为最重要的是 理解它的功能,并化为己用。

c语言是什么?

首先我们要明白,C语言是众多 计算机语言 的一种,同时也是我们对于编程学习很重要的一环,许多编程语言,例如 java C++ 都是基于C语言发展而来,它的 系统编程、高效性、跨平台、嵌入式系统、可移植性 让它在计算机编程领域的地位经久不衰
截取自HelloGitHub

学习C语言的必要性

明白了什么是C语言,我们更要知道为什么要学习C语言, 理解计算机底层逻辑 C语言是一种接近计算机底层的语言,它可以帮助你更好地理解 计算机工作原理、内容管理、 指针 等重要概念 系统编程能力 它可以帮助你开发操作系统、设备驱动程序等等 提高编程能力 作为初入编程大门的我们来说,C语言是我们开启自己打怪升级之路的不二法门,同时为我们之后学习其他语言也能打下扎实的基础 嵌入式系统开发 许多嵌入式系统都是使用C语言开发的,例如开发智能手机、汽车电子系统、家用电器等等 就业竞争优势 虽然现代编程语言层出不穷,但是C语言仍然是许多岗位的基础要求,虽不能说是优势,但掌握好C语言也能让自己的编程之路更加广阔。

我的第一个C语言程序

#include<stdio.h>
int main()
{
    printf("Hello world");
    return 0;
}

睁开眼睛第一句:Hello world

#inculde<stdio.h>

为头文件,其中 stdio 是 standard(标准) input(输入) output(输出) 的缩写

为什么一定要有呢?

实现 标准输入输出功能 在这段代码中我们用到了 printf( ) 函数, 提高代码可读性 当他人阅读你的代码时可以通过查看 #include 指令来了解你的代码使用了哪些库函数

main函数

int main()

每个C语言程序不管有多少代码,都是从 main 函数开始的 也就说 main函数是程序的入口,也被称为 主函数 int 则表示 main 函数结束后返回一个整型的值 这也就是我们后面要写一个 return 0 的作用

那这个时候我们可能会有一个疑问:

在一个源程序中,main函数的位置在哪里呢?

A.必须在最开始 B.必须在库函数之后 C.必须在最后 D.任意位置

怎么样,大家心里有答案了吗?答案等我们介绍完库函数之后再揭晓

printf和库函数

printf("Hello word");

其中 printf 实现了在屏幕上的信息的打印, printf 也就是一个 库函数 这是C语言中最基本、最常用的函数,用于进行输出操作。

那什么是库函数呢?

为了 提高程序员的开发效率 ,C语言标准规定了一组函数,这些函数再由不同的编译器厂商根据标准进行实现,提供给程序员使用,这些函数组成了一个函数库,被称为 标准库 ,这些函数也被称为库函数,一个系列的库函数一般会声明在同一个头文件中,所以 库函数的使用,要包含对应的头文件

具体库函数请参考此链接 link

咱们上一题的答案是 D 哦,main函数可以在任意位置,函数的声明或者头文件的包含需要放在 main 函数之前,这样确保在 main 函数中调用的函数在编译时能够被正确识别,举个例子

//头文件 stdio.h
#include<stdio.h>
//函数声明
int calculate_sum(int a,int b);
int main()
{    
    int num1 = 5;
    int num2 = 7;
    //调用函数
    int sum = calculate_sum(num1, num2);
    //打印结果
    printf("Sum:%d\n",sum);
    return 0;
}

但是 main函数还是 只能有一个 并且在程序的命令空间中

何为关键字、字符及ASCII编码

关键字

C语言中有一批保留的名字的符号,例如 int 、if、 return, 这些符号被称为 保留字关键字

  • 关键字都有自己的特殊意义,是保留给C语言使用的
  • 我们在创建标识符的时候不能于关键字重复
  • 关键字不能自己创建

C语言的32个关键字如下:

auto break case char const default do double else enum extern
float for goto if int long register return short signed sizeof static
struct switch typedef union unsighed void volatile while

这32个关键字是使用最多的
关于C语言关键字的全部介绍可以点击这个链接了解link

字符

键盘上可以敲出各种字符,例如:a, b, c, !, @, $ 等等,这些都可以称为 字符 C语言中字符用单引号括起来,例如: ‘a’ ,‘@’ ,‘$’

ASCII编码

计算机的数据都是以二进制的形式存储的,为了方便大家相互通信,不造成混乱,美国国家标准学会(ANSI)出台了一个标准的ASCII编码,C语言中的字符就遵循ASCII编码
在这里插入图片描述
我们不需要记住这张表的所有,使用时查看即可,为了方便,我们也可以记住以下的几组特殊数据:

  • 字符A~Z的ASCII码值为 65~90
  • 字符a~z的ASCII码值为 97~122
  • 对应的大小写字符的ASCII码值的差值时32
  • 数字字符0~9的ASCII码值为 48~57
  • 换行 \n 的ASCII码值为:10
  • 0~31这32个字符是不可打印字符,无法打印在屏幕上面观察,比如:蜂鸣、回车、换行

单个字符 可以用%c来指定格式

#include<stdio.h>
int mian()
{
    printf("%c\n",A);
    printf("%c\n",65);//这里65为字符A的ASCII码值,也可以正常打印
    return 0}

字符串和\0

使用 双引号 括起来的一串字符就被称为字符串,例如"abcd@#$"

字符串可以使用%s来指定格式

#include<stdio.h>
int main()
{
    printf("%s\n","I love C")
    return 0;
}

字符串的末尾隐藏放着一个 \0 字符,它是字符串的结束标志

转义字符是啥

简单来说就是 转变原来字符意思的字符 我们上述提到的 \0 就是一个转义字符

C语言中常见的转义字符
在这里插入图片描述
其中值得注意的是

  • \b 光标回退一个字符,但不删除字符
  • \ddd ddd表示1-3个八进制数字(八进制不包括数字8)
  • \xdd dd表示2个十六进制数字
  • \0 是 \ddd 的一种,其ASCII码值为0

语句分类

空语句

一个分号就是一个语句,是空语句

#include<stdio.h>
int main()
{
    ;//空语句
    return 0;
}

那空语句的作用是什么呢?
一般是程序中需要一条语句,但这个语句不需要做任何事,就可以用它

表达语句

表达语句就是在表达式的后边加上分号

#include<stdio.h>
int main()
{
    int a,b,c;
    a = 93;
    b = 77;
    c = a + b;//表达式语句
    return 0;
}

函数调用语句

函数调用的时候,也会加上分号

#include<stdio.h>
void greet();//声明一个名为greet的函数,它不接受任何参数,也不返回任何值

int main()
{
    greet();//调用名为greet的函数
    return 0;
}
//函数定义
void greet()
{
    printf("I am a little tired now.\n");//函数调用语句
}

复合语句

成对括号中的代码就构成了一个代码块,也被称为复合语句

#include<stdio.h>
int main()
{    //复合语句开始
    {
        int a = 66;
        int b = 88;
        int sum = a + b;
        printf("The sum of %d and %d is %d\n",a,b,sum);
    }//复合语句结束
    return 0;
}

控制语句

C语言支持三种结构:顺序结构、循环结构、选择结构,它们由特殊的语句定义符组成,共有9种控制语句

  • 条件判断句(分支句) :if语句、switch语句
  • 循环执行语句 :do while语句、while语句、for语句
  • 转向语句 :break语句、goto语句、continue语句、return语句

如何注释

注释是对代码的解释说明,编译器会忽略,但是注释很 重要 ,留下必要的注释不仅方便了自己,也方便了他人,更能养成良好的编码习惯

  • /* */注释 可以插在文中
  • //注释 只是单行注释

C语言的数据类型和变量

数据类型

在这里插入图片描述

字符型

char

整型

//短整型
short int
//整型
int
//长整型
long int
//更长的整型
long long int

浮点型

//单精度
float
//双精度
double
//更精确的
long double

布尔类型

_Bool

布尔类型是专门表示真假的
使用时要包含头文件 <stdbool.h>
取值为 true、false

#include<stdio.h>
#include<stdbool.h>
_Bool target = true;
if(target)
    printf("To be better");

各种数据类型的长度

每一种数据类型都有自己的长度

sizeof操作符的注意事项

sizeof 是一个关键字,也是操作符,专门用来计算操作符数的类型长度的,单位是字节(Byte)

sizeof(类型)
sizeof 表达式 //括号可以忽略

sizeof后面的表达式是 不真实参与运算的,根据表达式的类型来得出大小
sizeof的计算结果是 size_t 类型的

#include<stdio.h>
int main()
{
    printf("%zd\n",sizeof(char));//使用%zd用于格式化输出 size_t 类型
    printf("%zd\n", sizeof(short));
    printf("%zd\n", sizeof(int));
    printf("%zd\n", sizeof(long));
    
    return 0;
}

signed vs unsigned

signed int a;
//等同于 int a;

unsigned int b;
//这里的b为非负整数

使用unsigned的好处是节省内存
字符 char 也可以设置signed 和 unsigned
C语言规定char类型是否带有正负号,由当前系统决定

变量

顾名思义,C语言中经常变化的值称为 变量 ,不变的值为 常量

怎么创建变量

首先我们要了解类型,类型是用来 创建变量
变量创建的语法形式是这样的:

data_type name;
    |       |
    |       |
数据类型    变量名
int age;//整型变量
char ch;//字符变量
double weight;//浮点型变量

变量在创建的时候就给一个初始值,就叫初始化,初始化是一个好习惯,如果不初始化,有些编译器会报错,局部变量不初始化为随机值,全局变量不初始化默认值为0

int age = 18;
char ch = 'y';
double weight = 54.0;
unsigned int height = 160;

变量分为哪些

  • 全局变量
    在大括号外部定义的变量就是全局变量,全局变量在整个工程中都是可以使用的
  • 局部变量
    在大括号内部定义的变量,只能在自己所在的局部范围使用
    举个例子
#include<stdio.h>

float GPA = 4.0;//全局变量

int main()
{
    float aim = 3.8;//局部变量
    printf("%f\n",GPA);
    printf("%f\n",aim);
    return 0;
}

如果此时局部和全局变量的名字相同 局部变量优先在这里插入图片描述

局部变量放在内存的 栈区
全局变量放在内存的 静态区
堆区用于动态内存管理

操作符

算术操作符

为了方便运算,提供了一系列操作符,算术操作符有: + - * / % ,这些操作符都是双目操作符(有两个操作对象),操作符也可以称为运算符
我们具体说说 / %

/ 用来完成除法

除号两端如果是整数,执行整数除法,得到结果也是整数,如果希望得到浮点数的结果, 两个运算数必须至少有一个浮点数
举个例子

#include<stdio.h>
int main()
{
    int x = 6 / 4;
    float y = 6.0 / 4;
    printf("%d\n",x);
    printf("%f\n",y);
    return 0;
}
% 用来取模(余)

注意这个运算符只能用于 整数
负数取模后的结果取决于第一个运算数的正负号
举个例子

#include<stdio.h>
int main()
{
    int a = 6 / 4;
    int b = -6 / 4;
    printf("%d %d\n",a,b); 
    return 0;
}

赋值操作符

=
//复合操作符
+=    -=
*=    /=    %=
>>=    <<=    
&=    |=    ^=

单目操作符

++ – +(正) -(负)

a++ vs ++a的区别
  • ++a为前置++
    计算口诀 :先+1,后使用
  • a++为后置++
    计算口诀 :先使用,后+1

我们一起做一道题练练手吧

下面代码的运行结果是:

#include <stdio.h>
int main()
{
	int a, b, c;
	a = 5;
	c = ++a;
	b = ++c, c++, ++a, a++;
	b += a++ + c;
	printf("a = %d b = %d c = %d\n:", a, b, c);
	return 0;
}

怎样,大家心里有答案了吗?

接下来看看解析吧

#include <stdio.h>
int main()
{
	int a, b, c;
	a = 5;
	c = ++a;//这里 a先+1 再给c赋值,a=6,c=6
	b = ++c, c++, ++a, a++;
	//这里,表示优先级  c先+1 再赋值给b 之后的 c++ ++a 按照从左到右依次计算,c=7,b=7,c=8,a=7,a=8
	b += a++ + c;//b = b + a++ + c,7+8+8=23,a再+1,a=9
	printf("a = %d b = %d c = %d\n:", a, b, c);//a = 9 b = 23 c = 8
	return 0;
}

强制类型转换

请大家看以下示范

int a = 3.14;//a的是int 类型,3.14是double类型,两个类型不一致,编译器会报警告
int a = (int)3.14;//将3.14强制类型转换只取整数部分

但是,最好还是不要这么做哦

scanf和printf介绍

scanf

scanf()函数用于读取用户的键盘输入
举个例子

#include<stdio.h>
int main()
{
    int age = 0;
    printf("请输入年龄:");//stdout标准输出
    scanf("%d",&age);//stdin标准输入
    printf("年龄是;%d\n",age);//stdout标准输出
    return 0;
]

当程序运行到这个语句时,会停下来,等待用户从键盘输入,将其存入参数

scanf("%d"&age)

如上述例子所示, scanf( )函数的第一个参数为%d, %是一个占位符,d表示整数,它 必须提前知道用户输入的数据类型 ,才能处理数据。第二个参数 &age &是取地址符号,因为 scanf( )传递的不是值,而是地址 。如果这里是指针变量就不用加 &

需要注意的是
scanf( )处理数值占位符是,会 自动过滤空白字符,包括空格、制表符、换行符等
scanf() 可以连续处理多个占位符,读到第一个不符合条件字符就停止
scanf函数是有返回值的,返回值是一个整数,表示成功读取的变量个数
如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF (-1)。
EOF - end of file ⽂件结束标志

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    float f = 0.0f;
    int r = scanf("%d %d %f", &a, &b, &f);
    printf("a=%d b=%d f=%f\n", a, b, f);
    printf("r = %d\n", r);
    return 0;
}

这里我们再考虑scanf( )函数的赋值忽略符 *
当我们有些时候输入不符合规则的符号时,可以用 * 忽略
举个例子

#include <stdio.h>
int main()
{
    int year = 0;
    int month = 0;
    int day = 0;
    scanf("%d%*c%d%*c%d", &year, &month, &day);
    return 0;
}

printf

printf() 用于将参数文本输出到屏幕,为print(打印)和 f 组成,其中的 f 代表了 format(格式化),表示可以定制输出文本的格式
值得一提的是 printf( ) 可以在输出文本中指定占位符, 占位符 就是这个位置可以用其他值代入

#include<stdio.h>
int main()
{    
    printf("There are %d cats\n",3);//%d就是一个占位符,表示代入的值一定为一个整数
    return 0;
}

注意 占位符的第一个字符一律为%,第二个字符表示占位符的类型
输出文本里可以有多个占位符
举个例子

#include<stdio.h>
int main()
{
    printf("%s says it's %d o'clock\n right now","zhangsan",23);
    return 0;
}

注意printf()参数与占位符是一一对应的关系,顺序不能随意更换

一些常用的占位符

  • %d:十进制整数//int
  • %f:小数// float -%f double -%lf
  • %hd: 十进制short int
  • %hu:unsighed short int
  • %ld:十进制long int
  • %lu:unsighed long int
  • %Lf:long double
  • %p: 指针
  • %s:字符串
  • %u:无符号整数
  • %x:十六进制整数
  • %zd:size_t

printf( )允许限定占位符的 最小宽度
举个例子来看吧

#include<stdio.h>
int main()
{
    printf("%5d\n",123);//输出为“  123”,C语言默认的是右对齐
    printf("*5d\n",123);//输出的是“123  ”,需要左对齐,在前面填个负号即可
    return 0;
    printf("%12f\n",123.45);//小数默认显示的是小数点后6位
}

printf()还可以限定小数点的位数
举个例子

#include<stdio.h>
int main()
{
    printf("Number is %.2f",0.5); //.2f表示限定小数点后两位
    return 0;
}

这种写法也可以和限定宽度占位符结合使用

#include<stdio.h>
int main()
{
    printf("%6.2f\n",0.5);//表示输出字符串最小宽度为6,小数点后两位
    return 0;
}

最小宽度和小数位这两个限定值,都可以用 * 代替,通过 printf( ) 的参数传入

#include<stdio.h>
int main()
{
    printf("%*.*f\n",6,2,0.5)//相当于printf("%6.2f\n",0.5)
    return 0;
}

还可以用 %.[m]s 指定输出部分字符串 [m]代表一个数字,表示所要输出的长度

#include<stdio.h>
int main()
{
    printf("%.5s\n","hello world");//只输出前5个字符 输出hello
    return 0;
}
  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值