@[TOC](目录
## 前言
内容
# 1.第一个C程序
# 2.标识符
# 3.变量
# 4.数据类型
### 1.1整型
### 1.2浮点型
### 1.3字符型
# 5.运算符
# 6.符号常量
# 7.标准化输入输出
# 8.语句结构
## 1.1顺序结构
## 1.2择结构
## 1.3循环结构
## 9.break和continue语句
# 10.数组
# 11.函数
# 12.指针
## 总结
:)
前言
大家好!很高兴与各位读者见面,如果你是一名程序猿,那么对c语言入门知识再熟悉不过了。本篇文章主要讲解一些c语言入门知识,希望能帮助大家!
1.第一个C程序
作为C语言新手,下面我们先来打印一段简单的代码。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { printf("Hello world\n"); return 0; }
这段代码的运行如下:
main()是一种函数,int表示此函数返回类型是整型,return 0表示返回整型,后面我都会给大家讲讲。
看起来很简单吧,是不是对c语言感兴趣了呢?下面让我们一起进入跨进c语言大门吧!
2.标识符
标识符:标识符是程序中的变量、常量、函数、数据类型等任何用户自定义项目的名字。
C语言中标识符的命名规范:
- 标识符是以字母或下画线开始的,由数字、字母和下画线所构成的字符串。其中字母包括A~Z或a~z,数字包括0~9。(注:c标识符不允许出现标点字符,比如@、¥和%。)
- 标识符对大小写敏感,即严格区分大小写。例如:panda_6和Panda_6是两个不同的标识符。(注:一般对变量名用小写字母,符号常量用大写字母。)
- 不能把C语言关键字作为自定义的标识符,例如:if、for和while等。
- 标识符尽量做到“见名知意”,例如:长度(英文:length),求和(英文:sum)
3.变量
下面我们来看这一段代码了解变量:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int num = 0; //定义变量num,并初始化 num = 100; //给变量赋值 printf("%d\n", num); //打印变量的值 return 0; }
- 定义变量
通过定义变量向内存中申请内存空间,从而可将待处理数据放入内存中。
- 变量必须先定义,在使用
定义变量就是向内存中申请分配存储空间,如上述代码段int num(定义num为整型)后续会讲。
- 变量的初始化
在定义变量同时给变量赋值,上述代码段中给变量num赋值为0,如果不给变量赋值,那么变量的值是不确定的可能会导致程序产生错误结果。
4.数据类型
整型
整型变量 描述 字节数 数值范围 int 整型 4 0~(2^32-1)和-2^31~(2^31-1)
short int 短整型 2 0~(2^16-1)和-2^15~(2^15-1) long int 长整型 4 0~(2^32-1)和-2^31~(2^31-1) long long int 64位长整型 8 0~(2^64-1)和-2^63~(2^64-1)
浮点型
类型 描述 字节数 有效位数 float 单精度 4 6~7 double 双精度 8 15~16 long double 长双精度 16 18~19
浮点型指数形式表示方法: 字母e可以大写也可以小写,e前后必须有数字,e后的数字成为阶码,阶码只能是整数,可以带符号。 例如:5756.913的指数形式是5.756913e3或是5.756913E3,
-0.0003618的指数形式是3.618e-4或是3.618E-4
字符型
1.字符型常量
用单括号括起来的单个字符,例如:'a',’b‘,’c‘,’?‘,’=‘
(注:字符型常量常以ASCII码的形式存储在计算机中。例如:字符’a'的ASCII码值是01100001,对应的十进制数是97。)
2.字符型变量
看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char a, b; //定义字符型变量 a = 'm'; //对字符变量a赋值 b = 'n'; //对字符变量b赋值 printf("%c %c\n", a, b); //%c用来打印字符 return 0; }
上述代码段中 a,b是定义的字符型变量,其类型是char型,被分配一字节的内存空间,用于存放单个字符值。
3.转义字符
转义字符是一种特殊的字符常量,通常以反斜杠(\)开头,转义字符由名称意义可知就是原字符被加上反斜杠后其意义发生改变,故称转义字符。例如:\n是一种转义字符表示“回车换行”。
4.字符串常量
字符串常量是由一对双引号括起的字符序列,例如:“abcdef” “C language” “56231001” “ABCDEF”
(注:字符串常量在内存中存储时,除了每个字符占用一个字节以外,系统还在其最后一个字符的末尾添加一个字符(\0),作为字符串的结束标志。)
5.运算符
1.算术运算符
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 1, b = 3, c; c = a + b; //加法 printf("%d\n", c); c = a - b; //减法 printf("%d\n", c); c = a * b; //乘法 printf("%d\n", c); c = a / b; //除 printf("%d\n", c); c = a % b; //取余 printf("%d\n", c); return 0; }
2.赋值运算符
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 0; a = 2; //将2赋给变量a printf("%d\n", a); return 0; }
3.复合赋值运算符(常见)
符合运算符 原 等价 += a+=b a=a+b *= a*=b a=a*b /= a/=b a=a/b %= a%=b a=a%
三目运算符:x>y?x:y (x如果大于y,则执行x表达式,否则则执行y)
4.关系运算符
运算符 描述 < 小于 > 大于 <= 小于等于 >= 大于等于 == 等于 != 不等于
5.逻辑运算符
运算符 描述 意义 && 逻辑与
双目运算符
两个操作数同为真,结果才真,否则为假 || 逻辑或
双目运算符
两操作数一个为真则真,都为假则假 ! 逻辑非
单目运算符
若操作数为真,则非运算为假,若操作数为假,则非运算为真
6.自增运算符++
前置++,看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 0; int b = 2; a = ++b; printf("%d\n", a); printf("%d\n", b); return 0; }
上述代码段中++b表示b的值自增1,其结果赋给a。
后置++,看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 0; int b = 2; a = b++; printf("%d\n", a); printf("%d\n", b); return 0; }
上述代码段中b++表示b先把原值赋给a,再自增1。
注:同理与自增运算符++一样,自减运算符--原理相同。
7.逗号运算符
看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 1, b = 2, c = 3, x, y; y = ((x = a + b), (x + c)); printf("y=%d\nx=%d",y,x); return 0; }
逗号表达式求值过程:从左向右分别计算每个表达式的值,以最右边表达式的值作为整个逗号表达式的值。
6.符号常量
在C语言中的符号常量通常用一个标识符代表一个常量,称为符号常量。
输入格式: #define 标识符 常量
看下面一段代码的使用:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define M 100 //定义常量M的值为100 int main() { int a = 0; a += M; //使用常量M printf("%d\n", a); return 0; }
上述代码常量M可以直接使用。
7.标准化输入输出
printf(),scanf()是一个库函数,分别是格式化输出和输入。
- 非格式字符:按原样输出。
printf("a");
- 转义字符:按对应含义输出。
printf("\n");
- 格式字符串:以%开头,在后面跟各种格式字符。
格式字符 含义 d 以十进制形式输出带符号整数 lld 以十进制输出long long型带符号整数 f 以小数形式输出单、双精度实数 llu 64位无符号整数 o 以八进制输出无符号整数 x,X 以十六进制输出无符号整数 c 输出单个字符 e,E 以指数形式输出单、双精度实数 g,G 以%f或%e中较短的输出宽度输出单、双精度实数 u 输出无符号整数 s 输出字符串
(注:scanf函数输入必须添加取地址符&)
如:scanf("%d",&a); //表示读入十进制整数a。
- getchar()函数单个读入字符。
实例:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char a; a = getchar(); printf("%c", a); }
输入m字符,getchar()函数读取m后,再赋给a。
8.语句结构
1.1顺序结构
代码案例:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 1; int b = 2; printf("%d\n", a + b); }
1.2选择结构
1.if-else语句
代码案例:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 0; int b = 0; scanf("%d%d", &a, &b); if (a > b) printf("%d", a); else printf("%d", b); }
if语句嵌套,看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 0; scanf("%d", &a); if (a > 1 && a <= 5) if (a != 2) printf("haha"); //1 else printf("hehe"); //2 else printf("wuwu"); //3 return 0; }
输入:3 则执行语句1
输入:2 则执行语句2
输入:6 则执行语句3
综上所述,在if语句中出现多个if-else语句时,我们要注意if和else的配对问题,C语言规定else总是与它前面最近的且尚未与其他else配对的if配成一对。
2. switch语句
看下面一段代码实现switch语句:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 0; scanf("%d", &n); switch (n) { default:printf("D"); break; case 1:printf("A"); break; case 2:printf("B"); break; case 3:printf("C"); break; } return 0; }
1.3循环结构
1.while语句
while语句一般形式:
如图:expression是循环条件,当条件为真进入循环,否则跳出循环。break也可以跳出循环后期会讲。
来看下面一段代码实现while语句:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 5; while (n) //当n等于0时结束循环,因为0本身为假 { printf("haha\n"); //每循环一次打印一次haha n--; //n自减1 } printf("hehe\n"); //循环结束打印hehe return 0; }
2. for循环
for一般形式:
看下面一段代码实现for语句:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 5; for (int i = 1; i <= 5; i++) //for(初始化i=1;i范围小于等于5;i自增1) { printf("haha\n"); //每循环一次打印一次haha } printf("hehe\n"); //循环结束打印hehe return 0; }
上述代码段还可以写成:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n = 5;
int i = 1;
for (; i <= 5;)
{
printf("haha\n");
i++;
}
printf("hehe");
return 0;
}
由上图可知for后面括号内两个分号不能省略,但是三个表达式可以自行调整合适位置。
3.do-while语句
如图:不同于while语句,do-while语句是先执行一次循环体后在进行循环条件的判断。简单来说就是”先做后判“,而while语句是”先判后做“。
do-while语句一般形式:
下面看一段代码实现do-while语句:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int n = 5; do { printf("haha\n"); //每循环一次打印haha n--; //n自减1 } while (n); //n等于0结束循环,0本身为假 printf("hehe\n"); //结束循环后打印hehe return 0; }
9.break和continue语句
break:在循环语句中如果遇到break语句,则循环立刻终止。
continue:在循环语句中如果遇到continue语句,本次循环立刻终止,开始下一次循环。
总结:在写代码过程中我们可以合理利用三大语句结构进行组合来解决问题,可以利用break语句和continue语句操纵循环。
10.数组
1.一维数组
定义: 数据类型 数组名[常量表达式]
注:1.数组的类型是指数组中元素的类型,对同一个数组,其所有元素的类型都是相同的。
2.数组名的命名规则应符合C语言标识符的命名规则。
3.数组名不能和其他变量名相同。
初始化:
一维数组存储情况:
数组中的元素按其下标的顺序在内存中是连续存放的。上面右图表示每个数组对应的内存地址。
数组名arr表示该数组首元素地址,所以我们可以通过首元素地址找对数组中其他元素地址。
看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,6 }; int* p = &arr[0]; //定义指针变量 p,并把首元素地址赋予 p 中,(指针就是地址,后面会讲) printf("%p\n", arr); //打印数组首元素地址 printf("\n"); for (int i = 0; i < 6; i++) //创建临时变量i,用于找到其他元素地址 { printf("%p\n", (p + 1*i)); //用首元素地址找到其他元素地址 } return 0; }
运行如下:
注:此次元素地址与上面数组元素地址不一样是因为内存地址一直都会变d
2.二维数组
定义:数据类型 数组名[常量表达式1][常量表达式2];
初始化:
这两个初始化方式是一样的,第一个方框叫行,第二个方框叫列。
当数组元素未初始化完时,会直接被赋值为0;
大括号里面,可以看出两个一维数组,分别是第一行和第二行,剩余部分直接赋值为0。
注:二维数组存储顺序是从左往右,从上往下依次存储。且每个被存储的元素其内存地址也是连续的。
字符数组:
初始化:
注意事项:
printf()函数打印字符数组遇到转义字符\0会停止。
因为数组arr1中无转义字符\0所以不会停止打印,该数组后面内存地址是未知的,打印出来的是随机数。数组arr2中字符串末尾会自动包含一个转义字符\0,所以会停止打印。
11.函数
函数分类
1.有返回值函数
最开始讲的main函数就是有返回值函数,函数类型是int 型。
return语句功能是计算表达式的值并返回给主调函数。
2.无返回值函数
无返回值函数一般函数类型是void。
1.有参函数并调用
看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int text_6(int x,int y) //形参x,y { return x + y; //返回值为x与y的和 } int main() { int a = 1; int b = 2; int z = text_6(a, b); //实参a,b printf("%d", z); //变量z用于接收text_6函数的返回值 return 0; }
如图:text_6是我们创建一个函数,调用text_6函数并进行函数进行传参。
2.无参函数并调用
看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> void text_6() { printf("haha"); } int main() { int a = 1; int b = 2; text_6(); return 0; }
如图:text_6函数括号无参数,无参函数一般用来调用函数。
1.库函数:大多数编程语言都有已编号的函数库,我们只需要知道它们的使用方式然后调用即可。
如:add()表示加法运算、 pow()表示次方运算。
2.用户自定义函数:由用户解决问题的需要编写的函数。
如上述text_6()函数。
函数定义:
注:函数一定要先声明再使用。
形参与实参的关系:
简单来说形参是实参的临时拷贝,调用函数时创建形参,当函数调用完时,形参会自动销毁。
主调函数与被调函数关系:
当主调函数调用被调函数时,在内存中会创建一个临时空间用于被调函数的使用,当被调函数使用完时也会自动销毁。
12.指针
前面我们说过指针就是内存地址,就行我们家庭地址一样,警察要找到犯罪嫌疑人的家,就可以找到他的家庭地址,然后埋伏他。我们通过指针就可以找到对应的内存地址并进行操作。
看下面一段代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 10; int* p = &a; //创建指针变量p,并把a的地址赋给p,&是取地址符 printf("%p\n", &a); //打印a的地址 printf("%p\n", p); //打印p的地址 printf("%d\n", *p); //打印p的地址对应的内容,*p表示解应用p return 0; }
运行如下:
指针在x86编译器环境中4个字节,在x64中是8个字节。
- 总结
谢谢大家的阅读,很高兴能帮到大家,这是我第一篇博客,欢迎大家指出这篇文章中有许多不足之处我会努力学习修改进步。
更多推荐
简单c语言入门
发布评论