C语言中一些问题和代码的解释
引言:这只针对学过C语言但没学懂和自己的总结经验,本文只按照自己的思路,关于错误和问题一概不论。
关于简单的代码一概不论,这里只单讲入门且不能理解的东西,至于前期环境安装和一些基础问题可以参考其他博客和我以前的博客。
首先需要明白什么是指令和头文件?
1 |
#include是一条C预处理器指令,C编译器在编译前做的准备工作,而stdio.h是头文件,此文件包含共编译器使用的输入和输出函数,如scanf(),printf()等等。
没有此头文件,你前期的代码根本完成不了,那么问题来了
为什么不内置一个输入和输出,这样做不是更简单吗?
原因很简单,有些程序根本用不到输入和输出,那么不就多此一举了吗。
main()函数
1 | int main() |
此为入口文件,C程序通常情况下按main()开始执行。
int是返回值,但也是默认值。表明main()函数返回值是整数。
在现有学生阶段我们还可以用这样写
1 | viod mian() |
但是这种写法并不认可,如果你用多个编辑器写的程序用此可能会报错。
注释过于简单不讲只讲风格
/* 这也是一条注释
, 被分成两行。*/
//这种注释只能写一行
花括号
花括号把main()函数括起来。一般而言,所有的C函数都使用花括号标记函数体的开始和结束。这是死规定,不能省略。
声明
1 | int i,j,k; |
此代码声明有i,j,k三个标识符,也就一个变量、函数或其他实体的名称。int 表明i,j,k三个标识符是一个整数。
return语句
1 | return 0; |
有返回值的C函数要有return语句。该语句以return关键字开始,后面是待返回的值,并以分号结尾。
getchar();
这行代码会让程序等待击键,窗口会在用户按下一个键后才关闭。
关于浮点数
1是整数,1.00是浮点数
C语言提供3个附属关键字修饰基本整数类型:short、long和unsigned。
应记住以下几点。
short 类型占用的存储空间可能比int少,short是有符号类型。
long占用的存储空间可能比int多,适用于较大数值,long是有符号类型。
unsigned int或unsigned只用于非负值。这种类型与有符号类型表示的范围不同。例如,16位unsigned int允许的取值范围是0~65535,而不
是-32768~32767。用于表示正负号的位现在用于表示另一个二进制位,所以无符号整型可以表示更大的数。
char类型用于储存字符,它与int 声明都是一样的,这里只讲数组。
float 单精度浮点数,至少精确到小数点6位。
double 双精度浮点数,至少能表示小数点10位。
long double,更高精度,这里不讲。
字符串
C语言没有专门用于储存字符串的变量类型,字符串都被储存在char类型的数组中。数组由连续的存储单元组成,字符串中的字符被储存在相邻的存储单元中,每个单元储存一个字符。
注意每一个数组末尾都有字符\0,这为控字符,它表示字符串的结束,这意味着你定义储存40个字符实际上只能储存39个字符,剩下一个给空字符\0用的。
明示常量
1 |
printf函数(针对常用的)
1 | %c //单个字符 |
用法
1 | printf("%8d %8d %8d\n", a, b c);//这样会间隔一样比较美观 |
scanf函数
printf()函数使用变量、常量和表达式,而scanf()函数使用指向变量的指针。
如果用scanf()读取基本变量类型的值,在变量名前加上一个&。
但如果scanf()把字符串读入字符数组中,就不用&。
如以下代码
1 |
|
常用运算符
赋值运算符:=
等号左侧是一个变量名,右侧是赋给该变量的值。符号=被称为赋值运算符。赋值行为从右往左进行。
如i=i+1;
该语句的意思是:找出变量 i 的值,把该值加 1,然后把新值赋值变量i
加法运算符:+(不讲)
**减法运算符:-*(不讲)
乘法运算符:(不讲)
**除法运算符:/**(不讲)
运算符的优先级
对于C语言,运算符的优先级是从乘除到加减,优先级相同从左到右的顺序,当然=除外。(=是从右往左)
递增运算符:++
前缀递增符:++a
后缀递增符:a++
不同:优先级不同,前缀递增符先递增后运算。
后缀递增符先运算后递增。
举个例子:i=233*++a
a递增1,然后233乘以a,并赋值给i
i=233*a++
2乘以a,并将结果给i,然后a递增1
**递减运算符:–**(与递增相同)
循环
C语言有3种循环:for、while、do while
whlie循环
1 |
|
以上的代码打印2个的烫
如何强制退出循环?
break;
goto;等语句这里不必多讲
for循环
主要形式
for(初始值;初始值对比;初始值增加)
举个例子:
1 |
|
以上代码会输出两个烫
do while
至少执行循环体中内容一次
do
{
}while();
举个例子
1 |
|
以上代码会出现三个烫
switch和break语句
1 | switch ( 整型表达式) |
数组
数组类型
int ID[20];//储存20个int类型整数的数组
char Name[20];//储存20个字符的数组
float mark[20];//储存20个float类型的数组
二维数组
float a[5][12];//内含5个数组元素的数组,每个数组元素内含12个float类型的元素
float a[5][12]; // rain是一个内含5个元素的数组
float a[5][12] ; // 一个内含12个float类型元素的数组
if语句常见错误
1 | if (a < x < z) // 错误,没有使用逻辑运算符 |
正确的方式是用逻辑运算符连接两个关系表达式:
1 | if (a < x && x < z) // 使用&&组合 |