简介
本系列博客为我大三备战嵌入式软件工程师的基础知识复习过程,对于大一新生而言,学习c语言也是有所帮助的,后续我会推出c++相关的博客
c语言基础入门
第一个c程序
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");//输出Hello, World!并换行
}
在上面的程序中,我们实现了"Hello, World!"的输出,现在我们观察这段程序,
#开头的语句放在程序的开头,为预处理语句,在程序开始执行前交给c的预处理程序执行,这里的#include<stdio.h>是将标准输入输出头文件(standard input/output header)导入源程序文件中,当我们在使用一个函数时,应该把对应的头文件导入到当前文件中去,如这里的printf语句
在c和c++中空格和空行在编译器中会被忽略,不必理会,当然,为了美观,我们会在适当的地方加上空行和空格
int main(void)是每个可执行程序都有的一个组成部分,是程序开始执行的入口,前面的int表示函数返回值类型,main是函数名,(参数类型)可以传入特定参数,没有可以填写void表示没有参数,程序体在一对花括号{}中编写
printf是程序执行的语句,表示打印内容到控制台,在每条语句后应该有一个";"来表示该语句结束,这里建议将输入法的标点设置成英文标点,不然会报错
'\'是反义字符,当计算机遇到转义字符时会与下一个字母组成转义序列达到特定的输出效果
在编程过程中,我们会在代码中编写注释来解释代码内容,这是一个良好的习惯,新出炉的没有注释的代码,在一周以内,只有你,你的同事和上帝能看懂,一周以后,只有你和上帝能看懂,一个月以后,只有上帝能看懂[手动狗头],
我们用'//'表示单行注释,编译过程中会忽略本行中'//'后的内容,
我们用'/*注释内容*/'表示多行注释,编译器会忽视中间的内容部分
//单行注释
/*
* 多行注释
* 会被忽略
*/
总有人可以把注释使用的出神入化
//
// .::::.
// .::::::::.
// :::::::::::
// ..:::::::::::'
// '::::::::::::'
// .::::::::::
// '::::::::::::::..
// ..::::::::::::.
// ``::::::::::::::::
// ::::``:::::::::' .:::.
// ::::' ':::::' .::::::::.
// .::::' :::: .:::::::'::::.
// .:::' ::::: .:::::::::' ':::::.
// .::' :::::.:::::::::' ':::::.
// .::' ::::::::::::::' ``::::.
// ...::: ::::::::::::' ``::.
// ````':. ':::::::::' ::::..
// '.:::::' ':'````..
存储单元的基本概念
在计算机中每个变量都对应着三个属性:变量名,数据类型,数值
变量名用于标识计算机的一段存储空间,变量名有取名可以是任意的,但有一定规则
变量名只能由字母、数字和下划线组成。
第一个字符必须是字母或下划线,不能是数字。
变量名长度不能超过255个字符。
变量名是区分大小写的,即变量名中的大写字母和小写字母是不同的。
不能使用C语言中的关键字作为变量名,如if、while、int等。
变量名尽可能短,但需要保证语义明确。
变量名使用英文单词或单词缩写,不使用拼音。
变量名不使用缩写,除非是行业中常用缩写,比如 PDL (Paired Device List)1.
变量名应该能清晰反映变量的含义,可以适当使用约定俗成的简写,例如number简写成“num”,initialize简写为“init”等4.
数值被存储在对应的空间中
简单输入输出
#include <stdio.h>
int main(void ) {
printf("%d\n",5+10);
}
这个简单程序输出了简单的数字之和,其中'%d'用来表示输出的类型是一个整数,那么在c语言中,我们是如何实现输入输出的呢?
输入(基本数据类型)
我们常见的输入一般是从键盘获取信息或者文件的输入,这里我们说的是从键盘获取的输入.文件会在后面单独讲解
当我们要从键盘获取一个输入的时候,我们一般调用scanf函数来实现
int scanf ( const char * format, ... );
参数中const char * format表示固定格式的字符串,用来说明你要读取的数据的类型,
'&'是`取地址符,用于获取对应变量在计算机中的地址,第二个参数是地址
scanf是把对应的数据类型(第一个参数)的数据存储到对应的地址(第二个参数)中去
具体类型如下
Char 字符数据类型 %c
Short 短整型 %d
Int 整型 %d
Long 长整型 %d
Long long 更长的整型 %d
Float 单精度浮点数 %f
Double 双精度浮点数 %lf 定义可为:float weight = 98.6f 多加个f以便和单精度区分
输出(基本数据类型)
与输入相对应的,输出也只讲解向控制台输出
向控制台输出我们使用printf函数
int printf ( const char * format, ... );
参数中const char * format表示固定格式的字符串,用来说明你要输出的数据的类型,与输入不同的是,在格式化输出语句中,可以添加常量,在这里,我们可以把所谓的描述数据类型的信息看为占位符
第二个参数是要输出的变量
#include <stdio.h>
int main(void ) {
int a;
scanf("%d",&a);
printf("a的值为:%d",a);
}
在这段代码中,我们的scanf("%d",&a);语句表示将整型的键盘输入存储到变量a对应的内存地址中,并在下面进行了输出.在打印语句中%d可以看为变量a的占位符,将会被a的值替换
字符串的输入输出
字符串定义
字符串是一个或多个字符的序列(包括:数字、字母、空格等)如:
“This is an array of atrings” 要注意:双引号不是字符串的一部分。双引号仅告诉编译器它括起来的是字符串。
在c语言中,字符串的定义方式为
char name[length];
以数组的方式定义,且字符串的最后有标识符'\0'来表示字符串的结束,所以对于长度为n的字符串需要的数组的大小为n+1
输入输出
#include <stdio.h>
int main(void ) {
char string[10];
gets(string);
puts(string);//会自动换行
printf("-----\n");
printf("%s",string);//不会自动换行
printf("-----");
}
输出结果如下
C:\Users\Lenovo\Desktop\c_relearn\cmake-build-debug\c_relearn.exe
输入
输入
-----
输入-----
Process finished with exit code 0
使用gets从键盘读取字符串并通过puts方法来打印是最简单也是最推荐的方法,两个函数的参数都是字符串变量名.详细信息可以查看这篇博客
注意的是,使用puts函数输出时会自动换行,若不进行换行操作的话还是老老实实使用printf函数吧
算术运算
本节较为简单,简单过一下,详细内容参考【C语言程序设计】基本算术运算
在赋值操作中,我们使用'='将等式右边的值存储到左边的变量对应的内存中,左边必须是一个已经定义过的具体的变量,不可以是表达式
在右边的表达式中,我们需要注意
到当运算涉及到的是两个整型变量(a,b)时,a/b的值会取整
只有整数才可以进行取余(a%b)操作
#include <stdio.h>
int main(void ) {
int a = 2;
int b = 9;
double c = 12.1;
double d =15.1;
printf("%d\n",b/a);//4
printf("%d\n",b%a);//1
printf("%f\n",d/a);//7.550000
printf("%f\n",a/d);//0.132450
printf("%f\n",d/c);//1.247934
printf("%f\n",d%c);//error
}
相等和关系运算符
c语言语句要么进行一个操作,要么做出一个决策,相等和关系运算符的作用便是做出决策
关系运算符的结果只有两个,真(1)和假(0)
运算符 | 描述 | 示例 |
---|---|---|
== | 等于 | a == b |
!= | 不等于 | a != b |
> | 大于 | a > b |
< | 小于 | a < b |
>= | 大于等于 | a >= b |
<= | 小于等于 | a <= b |
运算方法与数学中相同,不过多赘述