第1章-C语言基础<超详细>-创新互联

目录

成都地区优秀IDC服务器托管提供商(创新互联).为客户提供专业的达州主机托管,四川各地服务器托管,达州主机托管、多线服务器托管.托管咨询专线:18980820575

前言

内容介绍

一个简单的C程序

第一个C程序 - 经典的“hello world”

printf的使用​​​​​​​

数据类型

C语言中的数据类型

字符型

整型

浮点型

补充 

常量和变量

常量

变量

格式控制字符

格式控制字符一览表

格式控制字符的特殊用法

特殊用法总结

转义字符

类型转换

自动转换

强制转换

ASCII表

C语言关键字

register

static

const

auto

extern

sizeof

typedef

volatile

C语言运算符

算数运算符

关系运算符

逻辑运算符  

位运算符

位移运算符

条件运算符

逗号运算符

自增自减运算符

C语言运算符优先级

易错警示


前言

从本章开始将从0开始讲解C语言

默认读者已经安装并且会使用C语言的相关编译器,所以C语言编译器的安装和使用就不再进行介绍,有不懂的小伙伴可以去:C语言编译器-完全攻略 查看相关内容

略去C语言的发展史等相关内容,有兴趣的小伙伴可以自行查找观看

注意:VS中想用scanf、printf等函数需要在最前面加上一个:

      #define _CRT_SECURE_NO_WARNINGS 

内容介绍

本章内容主要是C语言的基础内容:学会写一个简单的C程序、认识C语言中的数据类型、C语言常见关键字介绍、C语言运算符等等。

一个简单的C程序 第一个C程序 - 经典的“hello world”

那么接下来就从第一个C程序入手,开始我们的C语言之路

#include//1
int main()                   //2
{                            //3
	printf("hello world");   //4
    return 0;                //5
}                            //6

这段代码共有6行,是一段经典的入门代码,下面我们就来分析这一段代码:

第1行是一条预编译指令,意思是包含stdio.h的头文件。第2行是main函数的入口。第3行和第6行的两个大括号包裹的3、4行就是main函数的函数体。其中第4行的 printf("hello world"); 的作用是输出 hello world 这一串字符,第5行是函数的返回值,第4行和第5行最后的 ; (分号)表示这条语句结束。

可能这样分析对于刚入坑的小伙伴来说还是云里雾里的,但其实不用纠结那么多,初学时只需要记住这个框架即可,不必深究。至于预编译指令、头文件、函数、返回值等这些内容后面一定还会再详细地去讲,所以不用在这里纠结。

这段代码的运行结果如下图:(VS中可能会报错,在最前面加一个 #define _CRT_SECURE_NO_WARNINGS )

printf的使用

接下来我们看这样一个C程序代码

#include		//1
int main()						//2
{								//3
	int num = 88;				//4
	printf("num=%d\n",num);		//5
	return 0;					//6
}								//7

它的输出结果如下:

下面我们就来分析一下这段代码:我们只看第4行和第5行,其余的目前先记住模板即可。

int num = 88;  很好理解,就是num变量的值为88,即num是变量名,值为88。至于int是什么,下面就会讲到。

而printf则是这里重点要讲解的。printf是C语言的输出函数,大体使用规则为:

printf("<格式化字符串>",<参量表>)          输出双引号里的内容,其中参量表根据实际情况选择写或者不写。

分析:printf("num=%d\n",num); "num=%d\n" 就是格式化字符;num就是参量表中的内容

其中双引号内的%d是格式控制字符,也叫占位符,%是引导符,d表示十进制整数的形式。打印时并不是打印 “%d” ,而是表示打印的num。%d就相当于给num占一个位置,输出时num再过来将%d替换掉,随即输出num的值。而\n是转义字符,表示换行的意思,下面还会认识更多的转义字符。格式化字符串中除了格式控制字符和转义字符,其它的内容原样不变的输出到屏幕上。


看到这里相信很多小伙伴已经对printf的使用有了一定的了解。介于C语言输出输出函数繁多,就不在这里下太多笔墨了,有兴趣的话可以看这篇:C语言中常见的几个输入输出函数

数据类型

认识了一个简单的C语言代码是由哪些部分构成的、如何写一个简单的C语言代码之后,那么接下来我们就要学习C语言的一些基础的理论知识。正所谓基础不牢地动山摇,学好理论基础才能更好地实践。首先我们就来学习C语言种的数据类型

C语言中的数据类型 字符型

类型

字节数

取值范围

char

1字节

-128到127(-2^7—2^7-1 )

unsigned char

1字节

0到255(0—2^8-1)

整型

类型

字节数

取值范围

int

4字节

-2,147,483,648 到 2,147,483,647

(-2^31—2^31-1)

unsigned int

4字节

0 到 4,294,967,295

(0—2^32-1)

short

2字节

-32,768 到 32,767

(-2^15—2^15-1)

unsigned short

2字节

0 到 65,535

(0—2^16-1)

long

4字节

-2,147,483,648 到 2,147,483,647

(-2^31—2^31-1)

unsigned long

4字节/8字节

0 到 4,294,967,295

(0—2^32-1)

long long或__int64

8字节

-9,223,372,036,854,775,808到 9,223,372,036,854,775,807

(-2^63—2^63-1)

unsigned long long或unsigned __int64

8字节

0 到 18,446,744,073,709,551,615

(0—2^64-1)

浮点型

C语言中,输出double型以及float型时,默认输出6位小数(不足六位以0补齐,超过六位按四舍五入截断)

类型

字节数

取值范围

有效数字

精度

float

4 字节

0 和1.2E-38 到 3.4E+38

6

6 位小数

double

8 字节

0 和2.3E-308 到 1.7E+308

15

15 位小数

long double

16 字节

0 和3.4E-4932 到 1.1E+4932

19

19 位小数

补充 

  (1)long int和short int就等于long 和short 但一般省略不写

  (2)signed - 有符号的,即有正副;unsigned - 无符号的,即只有正没有

  (3) 一个bit(比特位)存放一个二进制位。一个byte(字节)=8个bit 。所以一个字节所占大小为2的八次方(1kb=1024byte)

(4)C语言中常见的3种进制:十进制  1234  正常开头;八进制  01234  以0开头;十六进制  0123456789abcdef  以0x开头

  (5)相同的数据类型在不同编译环境下的范围不同,因此以上的范围只供参考不同数据类型在不同环境下所占的字节数大致参考图如下:

常量和变量

变量和常量能够帮助理解数据类型。其实变量和常量并不难理解,中学阶段的数学中就已经接触到这两个名词了,这里还要啰嗦一下是因为C语言中的常量与变量和数学上的还是不完全相同的

常量

定义:值不能改变的量称为常量

常量的分类:

整型常量:100,125,-100,0

实型常量:3.14,0.125f,-3.789

字符型常量:'a', 'b', '2'

字符串常量:"a","ab","1232"

注意事项:

  (1)字符型常量用单引号,字符串型常量用双引号。比如 'a' 为字符常量,"a" 为字符串常量。每个字符串的结尾,编译器会自动的添加一个结束标志位 \0 即“a”包含两个字符 ‘a’ 和 ‘\0’ 。其中 '\0' 表示的是ASCII值为0,至于为什么,接下来就会讲到。

  (2)浮点型常量默认是double类型的,以f结尾的浮点型常量才是float类型的。例如

float num1 = 3.14;
float num2 = 3.14f;

中num1的3.14是double型,num2的3.14是float型的

变量

定义:值可以改变的量被称为变量

定义变量的方式:

1.存储类型 数据类型 变量名;

2.存储类型 数据类型 变量名=变量或者常量;

变量名属于标识符,标识符(变量名、函数名、重命名和取别名)有命名规则:

1.只能以数字、字母和下划线命名 

2.首字母不能是数字

3.不能与关键字相同

格式控制字符 格式控制字符一览表

格式

代表的字符

%d

int

%c

字符-a b c

%s

字符串-apple

注意:%s会自动根据所指定的地址去向后依次寻值,遇到\0结束

%hd

short

%ld

long

%lld

long long

%u

unsigned int

%f

float

%lf

double

%.100f

用来输出实数,保留小数点100位。

%g(%G)

根据数值大小自动选f格式或e格式,且不输出无意义的零

%o(%#o)

八进制整型 0(零) 开头(不加#没有前导符—0)

%x(%#x)

十六进制整型 0x或0X开头(不加#没有前导符—0x)

%e(%E)

指数形式的浮点数

%p(%#p)

地址的输出、指针的值(不加#没有前导符—0x)

%%

输出 %

%[^\n]

scanf中可以输入除了回车(\n)以外的所有字符

%[XX]

只读入XX内容,此时键盘输入的只能是XX内容

%[^X]

scanf中可以输入除了X以外的所有字符,读取到X时停止

(^表示取反的意思)

格式控制字符的特殊用法
  1. %nd 要求宽度为n位,如果不足n位,右对齐,前面补空格:如果足够n位,此语句无效(n为正整数,下同)
  2. %03d 要求宽度为3位,如果不足3位,前面0补齐:如果足够3位,此语句无效
  3. %-3d 要求宽度为3位,如果不足3位,后面空格补齐,默认左对齐:如果足够3位,此语句无效
  4. 注意: 没有%-0nd!
  5. %.nf 四舍五入后小数点后只保留n位
  6. %m.nf 控制总长度为m并右对齐,精度为n
  7. %-m.nf  控制总长度为m并左对齐,精度为n
  8. %.ne 保留小数点后n位小数的科学计数法
  9. %3s 限制每次读入字符串的内容大小(即每次读入3个字符),如果不做限制,可能会导致溢出
  10. %*d 表示忽略第一个整数
特殊用法总结

以下为引用内容

标志字符为-、+、#和空格四种,其意义下表所示:
- :右边填空格
+ :输出符号(正号或负号)
空格 :输出值为正时冠以空格,为负时冠以负号
# :对c、s、d、u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e、g、f类当结果有小数时才给出小数点

转义字符

常见的一些转义字符:

  • 注意事项:
  1. 单引号和双引号等特殊字符需要用转义字符输出,例如 """ 会报错,因为前两个括号会配对,应该"\""这样写
  2. \t是转移字符,水平制表,跳到下一个tab的位置不足八位以空格补齐,但是有些数据已经有八位了,所以\t会再补8个空格,导致错位

类型转换

C语言数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题转换的方法有两种:自动类型转换和强制类型转换。自动转换是编译器自动操作完成的,强制转换是人工手动操作完成的


自动转换

自动遵循一定的规则,由编译系统自动完成

自动转换的原则:

1、占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低

2、转换方向图示:

  • 详解如下:

1)当表达式中出现了char、short、int类型中的一种或者多种,没有其他类型了。参加运算的成员全部变成int类型的参加运算,结果也是int类型的,例如:

printf("%d\n",9/2);

输出结果为:4

2)当表达式中出现了带小数点的实数,参加运算的成员全部变成double类型的参加运算,结果也是double型。例如:

printf("%lf",5.0/2);

输出结果为: 2.500000 

3)表达式中无实数的前提下。当表达式中有signed型也有unsigned型,参加运算的变量都变成无符号数参加运算,结果也是无符号数。例如:由于用到了if语句,可能有点小伙伴看不懂,所以先提前解释一下这段代码:如果a+b>0 就执行第一个printf,否则就执行第二个printf。

int a=-5;
unsigned int b=3;
if(a+b>0)
    printf("a+b>0\n");    //如果a+b>0 就执行这句
else
    printf("a+b<0\n");    //否则就执行这句

输出结果为: a+b>0        

结果分析:表面上看a+b是小于0的,但由于b是unsigned型的变量,a的值和b在运算时自动转为unsigned型,所以结果为正数。但是注意:a的本质还是-5,只是在 a+b 运算时自动转换为unsigned型,运算过后a仍是-5

4)在赋值语句中等号右边的类型自动转换为等号左边的类型

5)注意自动类型转唤都是在运算的过程中进行临时性的转换,并不会影响自动类型转换的变量的值和其类型。例如:

int a; 
float b=6.68f;    //6.68后面加f代表6.68是float类型。不加则是double类型
a=b;
printf("a=%d\n",a);     //输出结果:6.68
printf("b=%g\n",b);     //输出结果:6    

强制转换

强制转换通过类型转换运算来实现把表达式的运算结果强制转换成类型说明符所表示的类型

两种写法如下:

(类型说明符)变量

(类型说明符)(表达式)

注意事项:

是将变量或表达式结果的类型转换,而不是左值变量的类型被转换

类型说明符必须加括号,表达式必须加括号,变量可以不用加括号

代码案例:

//强制转换 
int p=12; 
int q=8; 
double o; 
double x; 
double Y; 
o=(double)p/q;            //先将p强制转化为double型,然后输出结果自动转化为double型 
x=(double)p/(double)q;    //分别将p和q转化为double型 
Y=(double)(p/q);          //将p/q的结果转化为double型 
printf("%G\n",o);    //输出结果:1.5 
printf("%G\n",x);    //输出结果:1.5 
printf("%G\n",Y);    //输出结果:1
ASCII表

为了方便大家的日常学习需要,这里附上两种ASCII表

C语言关键字

C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。

1 - 数据类型关键字(12个):

(1) char (2) double (3) enum (4) float (5) int (6) long (7) short (8) signed (9) struct (10) union (11) unsigned (12) void

2 - 控制语句关键字(12个):
(1) for (2) do (3) while (4) break (5) continue (6)if (7)else (8)goto (9)switch  (10)case (11)default (12)return 

3 - 存储类型关键字(4个):

(1)auto (2)extern  (3)register (4)static 

4 - 其它关键字(4个):

(1)const  (2)sizeof (3)typedef (4)volatile 


可以看到上面讲到的数据类型中float、char、unsigned int等也是C语言常用的关键字。这么多关键字令人眼花缭乱。这里我们只是地挑选几个作为讲解

register

register是寄存器的意思,用register修饰的变量是寄存器变量

即:在编译的时候告诉编译器这个变量是寄在器变量,尽量将其存储空间分配在寄存器中,能让运行速率更快

注意:

(1):定义的变量不一定真的存放在寄存器中(会有寄存器空间不够的情况)

(2):不用register修饰一般情况下变量是在内存中运行的,cpu在取数据时去寄存器中取数据比去内存中拿数据要快

(3):因为寄存器比较宝贵,所以不能定义寄存器数组

(4):register只能修饰字符型及整型的,不能修饰浮点型

register char ch;//正确 register short int b;//正确 register int c;//正确 register float d;//错误

(5):因为register修饰的变量可能存放在寄存器中不存放在内存中,所以

不能对寄存器变量取地址。因为只有存放在内存中的数据才有地址

register int a; int *p; p=&a//错误,a可能没有地址

(&在C语言中有两种意思,一种是取地址符,是单目运算符;另一种是位运算符,表示“按位与”,是双目运算符)

static

static是静态的意思,可以修饰全局变量、局部变量、函数

static的作用:

  1. 使用static修饰的变量保存在内存的静态全局区中
  2. 将变量限制为内部链接属性。例如static修饰局部变量会将局部变量从外部链接属性转为内部链接属性
const

const表示只读

const可定义常量, 也可以用来修饰函数的参数和返回值。

用const修饰的变量是只读的,不能修改它的值,例如:

const int as=101; //在定义a的时候用const修饰,并赋初值为101,从此以后,就不能再给a赋值了 
a=111;//错误
auto

auto int a和inta是等价的,auto关键字现在基本不用。

相关介绍如下:

auto的早期作用

在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,所谓自动存储就是函数结束(出了作用域),这个变量自动销毁。这样的作用没有意义,因为现在的变量也是出了作用域就自动销毁。auto的这个用法就被消除了

extern

要点概括:

  1. extern是外部的意思,表示声明一个变量。即声明该变量是一个外部变量,也就是全局变量,所以 extern 修饰的变量保存在静态存储区(全局区)
  2. 同一个工程引用不同文件的变量或函数需要用extern声明,但前提得是全局变量而非局部变量(局部变量作用域只在大括号内,全局变量作用域是整个工程的)
  3. extern修饰局部变量时,不是定义局部变量,而是用在函数内部是声明一个全局变量

用法示例:

sizeof

用来测变量、数组的占用存储空间的大小(字节数)

用法示例:

int a=10;

int num;

num sizeof(a);

printf("num %d",num);
typedef

typedef重命名相关的关键字

作用是给一个已有的类型,重新起个类型名,并没有创造一个新的类型

用法:typedef 原类型名 新类型名;

常见用法:

typedef short int INT16;

// lNT16 b和short int b 是一个效果

拓展用法:

typedef int p(int , int);

//将p定义为int __(int ,int)类型的函数,定义 "p i;" == "int i(int, int);"

❁typedef两大陷阱陷阱

陷阱一:

记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。

比如:先定义:typedef char PSTR;然后:int mystrcmp(const PSTR, const PSTR);

const PSTR实际上相当于const char吗?不是的,它实际上相当于char const。原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。

陷阱二:

typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:

typedef static int INT2; //不可行

编译将失败,会提示“指定了一个以上的存储类”。

volatile

volatile易改变的意思

用volatile定义的变量是易改变的,即告诉cpu每次用volatile变量的时候,重新去内存中取

保证用的是最新的值,而不是寄存器中的备份。

volatile关键字现在较少使用

C语言运算符 算数运算符

+  -  *  /   %(取余,只有整数才能区域。浮点型数据不能取余)

%%(输出%)

+=   -=   *=   /=

(a+=3相当于a=a+3)

关系运算符

><  >= <=  !=  == (注意:两个 = 为判断是否等于,一个 = 为赋值)

  • 注意事项:

  (1)条件运算符的结果为0或1

int a=10>5;

int b=10<5;

printf("a %d,b %d\n",a,b);//输出结果: a=1,b=0(1为真,0为假)

//关系运算符连接的表达式的最终结果只有两个,真(非0)和假(0)

 (2)关系运算符一般用于判断条件是否满足

逻辑运算符  
  • 注意:为了提高编程效率,当逻辑与的第一个条件为假或者逻辑或的第一个条件为真时,其第二个条件或者语句直接不执行
  • 逻辑运算符的结果为0或1

&&-逻辑与

两个条件都为真,则结果为真

if(bb)&&(ab用不用括号括起来都对 //表达式必须加括号,判断语句可以不用加


‖-逻辑或

两个条件至少有一个为真,则结果为真

条件表达式中的 , (逗号)近似等于逻辑或


!-逻辑-非

逻辑非是单目运算符,表示取反


逻辑与逻辑或的短路原则

逻辑与 的短路原则:如果前面表达式的结果为假,则整体表达式为假,则后面所有的表达式都不会执行(因为要按顺序编译)

逻辑或 的短路原则:如果第一个表达式的结果为真,则整体表达式为真,所有后面所有的都不会执行

位运算符

相对于位进行操作,即数值都要转化为二进制数再进行操作


&  按位与

任何值与0得0,与1保持不变

0101 1011  

1011 0100

&

0001 0000


|  按位或

任何值或1得1,或0保持不变

0101 0011

1011 0100

|

1111 0111


~  按位取反

1变0,0变1

0101 1101

~

1010 0010


^  按位异或

相异得1,相同得0

1001 1100

0101 1010

^

1100 0110


位移运算符

>>右移     <<左移

右移:分逻辑右移和算数右移(不同计算机右移方式不同)

左移:高价溢出低位补0

逻辑右移:高位补0,低位溢出

1000 1111 //-15(二进制首位是0为正,是1为负) >>3 0001 0001 //17

算数右移:高位补符号位(正数补0负数补1)低位溢出

1000 1111 //-15 >>3 1111 0001 //-113

条件运算符

A?B:C:  也可以表示为  ()?():() 有没有括号都对,但一般都写括号

作用:首先判断表达式A的结果,如果为真,则执行表达式B;如果为假,则执丸行表达式C

其实条件运算符就是一个简单的lif else语句,即:

if(A) {B;} else {C;}

逗号运算符

(…,…,…)       注意:必须有括号!

使用逗号隔开的表达式从左向右依次执行,最后的表达式的值是整个运算的结果

例如:A=(B,C,D)

先运行表达式B,再运行表达式C,最后运行表达式D,最终变量A的值为表达式D的值

int a=10,b=20;

int c;

c=(a+=10,b+=10,a+=b);

printf("a =%d,b=%d,c=%d\n",a,b,c);    //输出结果为:50 30 50
自增自减运算符

++    --

1、将++或者--放在变量的后面时,先使用,后自增或自减

int m=520;

int n;

n=m++;

printf("%d\t%d\n",n,m);
//输出结果: 520 521

2、将++或者--放在变量的前面时,先自增或自减,再使用

int p=182;

int q;

q=++p;

printf("%d\t%d\n",p,q);

//输出结果: 183 183
C语言运算符优先级

在c语言的表达式中,如果存在多个运算符的时候,需要考虑数据的优先级和结合方向的问题。

所以在这里附上C语言运算符优先级的图,以供查阅

易错警示

VS想用printf等函数需要在最前面加上一个 #define _CRT_SECURE_NO_WARNINGS 

printf参数表中的逗号(,)不要忘记

float和double对应的%f、%lf不能混用

输出时不管是%f还是%lf都是默认小数点后6位,但可以用%.nf控制输出位数

注意:a+b和a+=b的效果不同

int a=10,b=20;

int c;

c=(a+=10,b+=10,a+b);

printf("a =%d,b=%d,c=%d\n",a,b,c);//输出结果为:20 30 50

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:第1章-C语言基础<超详细>-创新互联
标题来源:http://scyanting.com/article/dpiihs.html