初始C语言
本章的主要目的是对c语言有一个简单的认识。
前言
既然要去学习c语言,那首先我们需要了解什么是c语言。简单的来说:c语言是一门通用的计算机语言,它广泛的应用于底层开发。那么这就又牵扯到了什么是计算机语言(C/C++/JAVA等等),我们都知道语言分很多种有汉语、英语、日语等等,这些语言的存在方便了人与人的交流,而计算机语言它就是计算机能够识别的语言,通过这个计算机语言可以让计算机执行人所传输的指令。C语言是一种面向过程的计算机编程语言。(之后展开)
第一个c程序
#include<stdio.h>
int main()
{
printf("hello word\n");
return 0;
}
这其实就是一个简单的c语言的小程序,输出的结果为hello word。在这段代码中#include<stdio.h>是引用一个名为stdio.h的头文件,这个头文件包含了很多的库函数如:printf函数、main函数、scanf函数等等,不同的头文件包含的库函数也不相同。main函数是一个C程序的入口,一个c程序只能有一个main函数,多了就会报错。   编译代码的时候按下Ctrl+F5(如果不行的话按住FN+Ctrl+F5)
整个图放松一下 ?*。?(^ ? ^)??。(图片均在P站下载大家康康就好) 
数据类型
数据类型在代码中无处不在,我们学习c语言首先就应该去了解数据类型。我们生活中数据无处不在,例如价格20元,体重44.3千克,在c语言中我们应该如何去表示这些数据呢?在c语言中像20被称为整型也就int类型,像44.3被称为浮点型(float)等等,c语言中还有很多其他的类型。让我们来一一列举出来:
- char 字符型
- short 短整型
- int 整形
- long 长整型
- long long 更长的整形
- float 单精度浮点型
- double 双精度浮点型
为什么会有这么多不同的数据类型呢?原因在于不同的数据类型所占的内存空间的大小是不相同的,所以使用的时候需要考虑好,尽量让所写的代码的内存能够合理分配。那让我来具体的看一下这些数据类型的区别吧。(第一张图是代码一闪而过的一种解决方法)   由上图可以看出不同的类型的大小也不相同。所以当我们实际选择的时候要选择一些适合的,比如要定义一个变量来存储年龄,short能表示的范围在-32768——+32767,而int能表示的范围在-2^32 —— 2^32-1之间明显远远大于short这时候就应该选择short从而提高内存的利用率。其他的数据类型的选择也根据这一原则。 这些数据类型的简单应用:
int x=10;
char y='A';
float z=1.23;
当使用printf函数输出或者scanf函数输入的时候还有些需要注意的地方:
#include<stdio.h>
int main()
{
int x=0;
int y;
scanf("%d",&x);
printf("%d\n",x);
return 0;
}
- %c–字符
- %d–整形
- %s–字符串
- %p–地址
- %ld–长整型
- %f–单精度浮点型
- %lf–双精度浮点型
char x='A';
printf("%c\n",x);
printf("%d\n",x);
虽然都是输出x,但是结果有着很大的不同%c输出的是A,而%d输出的是65。为什么第二个输出的是65呢?因为在c语言中每个字符都会有一个对应的ASCII码的值(附上一个ascii表供参考) 
所以当使用输入输出函数时要注意%后面的字母是否出错。(并不是说char 定义一个变量后一定要用%c或者%s去输出,根据具体的代码来选择%后面的字母)
(放松X2) 
变量与常量
在我们生活中总是有一些值是不会发生改变的,例如圆周率,血型,身份证号码等等,而有些值是可以发生改变的如薪资,身高,体重等等,C语言中的常量与变量与生活中的一致。 那么怎样来定义变量呢?
int main()
{
short age=10;
age=11;
printf("%d\n",age);
}
变量: 变量也有两种大的类型:一种是局部变量,另一种是全局变量
int g=100;
int main()
{
int a=10;
int g=20;
printf("%d\n",g);
g=30;
return 0;
}
说到变量就需要引出两个概念—>作用域和生命周期 作用域: 局部变量的作用域:局部变量所在的局部范围 全局变量的作用域:整个工程 生命周期: 局部变量的生命周期:进入局部变量所在的范围,局部变量的生命周期开始,出局部变量的范围生命周期结束。 全局变量的生命周期:程序的生命周期。 常量: 常量的定义与变量相比有些许的不同。 首先是const修饰的常变量
int x=10;
const int y=2;
这里面的y就是const修饰的常变量,那什么是常变量呢?首先我们要清楚的是常变量它的本质还是一个变量只是被赋予了常属性(常属性可以理解为就是值在初始化后就不能进行更改了),举一个简单的例子,我们知道数组它在定义长度的时候,[ ]内的数要是一个常量,如果是一个变量程序就会报错,所以当你写出以下程序时:
const int n=10;
int arr[n]={0};
int arr[20]={0};
n=20;
其次是字面常量就例如3.4(3.4的值无法被改变无法赋予其他值所以就是字面常量)
接着是#define定义的标识符常量,这又是怎么定义的呢?请看下面的代码:
#include<stdio.h>
#define MAX 10
int main()
{
int a=MAX;
int arr[MAX]={0};
MAX=20;
}
最后是枚举常量(enum)    这就是枚举常量的简单用法,至此变量和常量的初步认识到这就结束了,大家都辛苦了,放俩张图放松一下(嘿嘿放松X3)   (当编译器支持C99标准时,它有一个变长数组的概念,即可以用变量来定义数组)
字符串、转义字符、注释
首先是字符串的概念:简单的来说就是由双引号引起的一串字符,简称字符串。 注意:字符串的结束标值是\0的转义字符,在计算字符串长度时\0作为结束标志,不算做是字符串的内容。
char arr1[10]="asdfgh";
char arr2[10]={'a','s','d','f','g','h','\0'};
 
其次是转义字符,转义字符就是转变原来的意思。下面是转义字符及其意义。  最后是注释这个其实很好理解,就是解释说明的语言,当然有的代码不用的话也是可以注释或者删除的,有了注释能让代码看起来更有感觉,注释的方法有以下两种:
int a=10;
int b=20;
要保证注释的语句在/* */里面,同时这两部分需要一一对应,否则会报错。 缺陷: c语言注释风格不能进行嵌套注释。 (写的比较多看到这的小伙伴们咱们再放松一下) 
选择语句
在我们的生活中面临着各种各样的选择,在c语言程序中也有选择。让我们来举一个简单的例子,就比如你现在要出一趟远门吧,你需要选择交通工具,为了方便我们用1来代表坐火车2来代表坐高铁3来代表坐飞机,让我们来开始写代码。
#include<stdio.h>
int main()
{
int input=0;
printf("请选择交通工具:");
scanf("%d",&input);
if(input==1)
printf("坐火车\n");
else if(input==2)
printf("坐高铁\n");
else if(input==3)
printf("坐飞机\n");
else
printf("输入错误请重新输入\n");
return 0;
}
这是第一种if的写法;
#include<stdio.h>
int main()
{
int input = 0;
printf("请选择交通工具:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("坐火车\n");
break;
case 2:
printf("坐高铁\n");
break;
case 3:
printf("坐飞机\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
return 0;
}
这是第二种switch的写法。 以上就是对选择结构的初步认识。 
循环语句
在我们生活中同样有些事情需要我们反复去做,要不断的重复某一种动作,在c语言中不断重复的过程也就是循环,在这里简单的介绍一下几种常见循环的基本形式,具体会在后面的博客进行详细的解释。 首先是while循环,例题的话我们都以打印1–10为例吧。
#include<stdio.h>
int main()
{
int x=1;
while(x<=10)
{
printf("%d ",x);
x++;
}
return 0;
}
接着是for循环
#include<stdio.h>
int main()
{
int x=1;
for(x=1;x<=10;x++)
{
printf("%d ",x);
}
return 0;
}
最后是do…while循环
#include<stdio.h>
int main()
{
int x = 0;
do
{
x++;
printf("%d ", x);
} while (x < 10);
return 0;
}
以上就是对循环的初步认识,目的就是能够知道什么是循环,知道循环大概是怎么去书写的,还有很多东西留到后面去写。好啦又到了咱们的放松时间。 
函数
对于函数这个概念,我认为函数就是一个比较独立的代码块,具体的话我们来看个例子吧,就用两数之和来作为例子。
#include <stdio.h>
int main()
{
int num1,num2,sum=0;
printf("请输入两个数: ");
scanf("%d%d",&num1,&num2);
sum=num1+num2;
printf("%d\n",sum);
return 0;
}
接下来是函数的写法:
#include <stdio.h>
int Add(int num1,int num2)
{
int sum=0;
sum=num1+num2;
return sum;
}
int main()
{
int num1,num2,sum=0;
printf("请输入两个数: ");
scanf("%d%d",&num1,&num2);
sum=Add(num1,num2);
printf("%d\n",sum);
return 0;
}
简单的了解一下函数的结构,以及使用方法,后面会深入学习。 
数组
所谓数组,那到底什么是数组呢?顾名思义数组就是很多数的集合,那么对于这些数有没有什么要求呢?是不是不管什么数组合在一起都是数组呢?在同一数组中存储的数必须满足以下两个条件: 这些数的类型必须相同。 这些数在内存中必须是连续存储的。(之后细讲) 我们这次的目的就是简单的认识一下,请看下面的代码
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
}
 
操作符
操作符的种类有很多,我们先来简单的介绍一下
- 算数操作符:+(加)-(减)*(乘)/(除)%(取模即求余数)
- 移位操作符: >>(右移操作符) 和<<(左移操作符)(移动的是二进制位)
- 位操作符: &(按位与) |(按位或) ^(按位异或)
- 赋值操作符:= += -= *= /= &= |= ^= >>= <<=
- 单目操作符(就是只有一个操作数)
! 逻辑反操作(简单点就是把真变为假把假变为真在c语言中0为假一切非零都为真,当被!改为真时默认就是1) – 负值 ) + 正值(忽视“ )”) & 取地址 sizeof 操作数的类型长度(单位是字节) ~ 对一个数的二进制位按位取反(可以理解为原来为1取反后为0,原来为0取反后为1) 0 – – 前置,后置(前置是先- -再赋值,后置是先赋值再- -)(忽略0) ++前置,后置(前置是先++再赋值,后置是先赋值再++) 0 * 间接访问操作符也可以说是解引用操作符(到指针再说,忽略0) (类型)强制类型转换float a=1.2;int b= (int)a; 这个小代码的意思就是说定义一个浮点型变量a其值为1.2,定义一个整形变量b它的值是将a强制转化为整形后的值,浮点型向整形转化会丢掉小数点后的数所以b=1。
有几个操作符需要注意一下%的左右两边必须是整数同时,与结果的符号与%左边的保持一致
移位和位操作符都是针对二进制位int a=10>>1; 这个的意思就是定义一个变量a它的值是10右移1,我们知道10的二进制位是00001010(只写后8个bit位,前面剩的24位全是0)它右移一位就得到了00000101转化为10进制就是5;
&按位与的话就是只有两个全为1时才为1,其他都为0,举个例子int a=3 & 6; 3的二进制为011,6的二进制为110,他们按位与之后的结果为010转换为10进制就是2;同理|按位或的话是只有两个全为0时才为0,其他都为1;^按位异或记住同为0异为1就好; 对于赋值操作符举一个例子其他都是同理a+=b; 就相当于a=a+b;
- 关系操作符
1.> 大于 2. >=大于等于 3. < 小于 4. <=小于等于 5. !=不等于 6. == 比较是否相等(单个=是赋值) -逻辑操作符 && 逻辑与(可以理解为并且,左右两个条件都为真) | | 逻辑或(可以理解为或者,两个有一个为真即可)
if(a=>1&&a<=10)
printf("haha\n");
if(a<=10||a>=20)
printf("haha\n");
- 条件操作符
exp1 ?exp2 :exp3(exp代表表达式)
int x=a>b?a:b;
- 逗号表达式
exp1,exp2,exp3… 逗号表达是遵循着从左到右依次计算,然后最后一个表达式的结果就是整个逗号表达式的结果

常见关键字
只是把它们的大致用法讲了下,后面会详细写它们的用法的
auto :定义自动变量(一般都被省略了)
int a=0;
short :定义短整型变量或函数 int: 定义整型变量或函数 long :定义长整型变量或函数 float:定义浮点型变量或函数 double :定义双精度变量或函数 char :定义字符型变量或函数 struct:定义结构体变量 union:定义共用数据类型 enum :定义枚举类型 typedef:用以给数据类型重命名(比如当一个结构体类型名称很长时,可以用typedef来给他重命名) const :修饰变量,使变量具有常属性,变量的值不能够被改变,并且用const定义一个变量的时候要初始化。 unsigned:定义无符号类型变量或函数 signed:定义有符号类型变量或函数 extern:它是用来声明其他源文件中的变量(也叫做外部变量) register:寄存器变量 static :声明静态变量 (当它修饰局部变量的时候,改变局部变量的生命周期但是不影响作用域 ;当它修饰全局变量时因为一个全局变量默认具有外部链接属性,被static修饰的时候外部链接属性会变成内部链接属性,此时全局变量只能在当前源文件中使用,其他源文件无法链接到,就无法使用;修饰函数也是同全局变量一样) volatile:说明变量在程序执行中可被隐含地改变 void :声明函数无返回值或无参数,声明无类型指针 if:条件语句 else :条件语句否定分支(与 if 连用) switch :用于开关语句 case:开关语句分支 for:一种循环语句 do :循环语句的循环体 while :循环语句的循环条件 goto:无条件跳转语句 continue:结束当前循环,开始下一轮循环 break:跳出当前循环 default:switch语句中的“其他”分支 sizeof:计算数据类型的长度 return :返回语句,比较常见的使用方法是与函数搭配使用 
总结
啊终于结束了,这是我第一次写这种博客,我大概用了两天的时间来写,里面肯定会有很多的不足,也有可能会有些错误,希望各位大佬们如果看到的话跟我说一下,我会及时的改正的,要是有什么好的建议,或者其他的一些东西都可以跟咱说,我会尽量去改变的,希望我们都能越来越好,加油!!!
|