C语言入门
Author: XFFer_
-网易云课堂
一 数据类型、运算符、表达式的介绍
1、常量和变量、整型、实型、字符型
-
新建项目
-
一个解决方案下可包含多个项目
运行快捷键 ctrl+fn+F5
添加debug断点快捷键 fn+F9
在debug模式下运行下一步fn+F10
换行语句\n
单行注释//
多行注释/* */
C语言每行语句的末尾都要有;
2、数据类型
字节越大表达范围越大(标注的前为32位后为64位)
-
基本类型
-
数值类型
-
整型
-
短整型
short
2/2 -
整型
int
4/4 -
长整型
long
4/8
-
-
浮点型
-
单精度型
float
4/4 -
双精度型
double
8/8
-
-
-
字符类型
char
1/1
-
-
构造类型
-
数组
-
结构体
struct
-
共用体
union
-
枚举类型
enum
-
-
指针类型
-
空类型
void
3、常量
在程序运行中其值不变的量
150; //整型变量
12.3; //实型变量(浮点型变量)
'a'; //字符常量
4、变量
组成:
标志符:由字母,数字,下划线组成,并且第一个字符为字母或下划线。
保留字:系统保留起来有特殊用途,不能作标识符使用。
变量名是标识符,变量名区分大小写
5、整型数据
1)整型常量
123;
-456; //(十进制)
012; //(八进制,以0开头的数字)
0x123; //(十六进制,以0x开头)
2)整型变量
-
基本型
int
(4字节) -
短整型
short int
short
(2字节) -
长整型
long int
long
-
无符号型
unsigned int
unsigned short
unsigned long
只能保存不带符号的数字,不能存负数 范围大一倍
sizeof
确定一个类型变量在内存中占多少字节。
printf("abc这个变量占的字节数是%d\n",sizeof(abc));
6、实型数据(浮点型数据)
1)实型常量
2.9; //十进制浮点数
168E2;
168E-2; //指数形式浮点数;在内存中实型数据以指数形式存储,E前/后 分开存储
2)实型变量
-
单精度变量
float
一般提供7位有效数字 -
双精度变量
double
一般提供15-16位有效数字
printf中%f
用来输出10进制的浮点数,%.20f
表示保留二十位小数的浮点数。
7、字符型数据(一个字节)
1)常规字符:用单引号引起来的一个字符
2)特殊字符转义字符
:以\开头的字符序列
-
\f
换页 -
\n
换行 -
\\
反斜杠 -
\'
单引号字符 -
\"
双引号字符
3)字符变量:只能保存一个字符char
因为一个字符型变量在内存中只占一个字节
char c1,c2,c3;
c1 = 'a'; //事实上是把字符对应的ascii码保存在了内存中
c2 = 'b';
c3 = '\"';
字符数据即能以字符形式输出,也能以ascii表对应的整数形式输出
printf
中%c
用来输出字符型数据
8、字符型常量 (两个字节)
用
""
引起来的一堆字符
c1 = 'a';
c2 = "a";
在内存中
a
字符c1(1个字节)
a``\0
字符串c2(2个字节)
\0
字符串结束标记,在printf
时并不输出。
9、变量赋初值
int a, b, c = 6; //只给c赋值,c语言中变量要先定义后使用
10、数值型数据的混合运算
系统中不同数据类型运算时,系统会尝试将类型统一。
系统会选取变量中能表达最大数字的变量,作为转化的最大类型。
double <-- float
double <-- long <-- unsigned <-- int <-- char,short
11、C语言的运算符
1)算术运算符和算术表达式
+
,-
,*
,/
,%
(取余,也叫模运算符,该运算符两侧都要求为整数)
两整数相除,系统会舍弃小数部分。
优先级问题:先乘除后加减,优先级相同时,按顺序计算。
2)赋值运算符: =
3)强制类型转换运算符:将一个表达式转换成所需要的类型。强制类型转换得到的是一个所转换到的类型的中间变量。
- 一般形式:
(类型)(表达式)
int a = 10;
double b;
b = (double)a;
//a本身类型并没有变化而是整个结果的类型发生变化赋值给了b
两种类型转换
-
自动类型转换
-
强制类型转换
4)自增和自减操作符 ++自增 --自减
i++
相当于i自身加了1,然后结果再赋给i。
用于循环语句中给自己加一减一
int i;
i++; //先用后加
++i; //先加后用
运算优先级
5)赋值运算符和赋值表达式
赋值运算符 =
: 将等号右边的值赋给等号左边的变量,等号左边是个变量(给变量一个值或者改变变量到某一个值)。
//几个概念
char a; //这个叫变量定义,系统会给a分配一个字节的内存,内存里面的值不确定
char a = 90;//这个叫变量定义,同时给变量赋初值(定义时初始化)
//字符的范围是-128到+127
a = 900; //赋值语句。会造成溢出,溢出后a里面的内容就会变得不可预料
赋值的原则:类型要相同,类型不同的用强制类型转换,必须明确知道不会溢出。
复合的赋值运算符(具有从右到左结合性):
在赋值运算符 =
之前加上其他运算符,构成了复合的赋值运算符*(复合的赋值运算符的两个运算符之间必须紧挨着不能用空格分开)*
-
+=
:a += 3
相当于a = a + 3
。 -
*=
:x *= y + 8
相当于x = x * (y + 8)
//如果*=
右侧是个表达式的话,则相当于该表达式有括号。 -
%=
:近似上述。
赋值表达式(复合的赋值表达式)本身也是有值的 —— 表达式的值等于等号右边的值
6)逗号运算符和逗号表达式
逗号运算符:将两个表达式连接起来;它的优先级是最低的!
格式:表达式1,表达式2
求解过程:先求解表达式1的值再求解表达式2,整个表达式的值是表达式2的值
int a;
a = 3*5, a*4 //结果是a=15, 整个表达式的值为60
逗号表达式的扩展形式
表达式1, 表达式2, ... 表达式N
二 程序的基本结构和C语言的语句
不同的字符所占的字节是不同的。
ASCII码:
一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。8bit(位)=1byte(字节)。
UTF-8编码:
一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码:
一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:
英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
1、语句的分类
-
控制语句:能够控制程序的执行流程,比如在一定的条件下执行某些语句,在另外的条件下,不执行该语句。
-
函数调用语句:由一个函数调用末尾增加个分号构成的语句。
-
表达式语句:由一个表达式构成的语句。
-
空语句:就一个分号。
-
复合语句:用{}括起来的语句。
⚠️ 注意点
-
C语言允许在一行上写几个语句。
-
C语言允许一个语句拆开几行写。(上一行用
\
结尾,进入下一行,这两行组成一个完整行)
printf(“断点停在\
这里”)
1)程序的三种基本结构:
-
顺序结构:先执行A操作再执行B操作;
-
选择结构:条件为真执行A操作,条件为假执行B操作;
if(3 >1)
{
printf(“3 > 1\n”);
}
else
{
printf(“3 < 1\n”);
}
//补充:多分枝选择结构switch
int k = 5;
switch(k)
{
case 1:
{
printf(“icount =1\n”);
}
break;
case 5:
{
printf(“icount = 5\n”);
}
break;
}
-
循环结构:
- 当型循环结构:先判断条件,才决定是否执行A操作,当P条件成立时,就一直反复的执行A操作,知道条件为假才停止循环。
int icount = 5;
while(icount >= 0)
{
printf(“icount = %d\n:,icount);
icount -= 1;
}
-
循环结构
- 直到型循环结构:先执行A操作,再判断条件,条件满足时反复执行操作,知道判断条件P为假停止循环。(至少执行一次A操作)
int icount = 5;
do
{
printf(“icount = %d\n”,icount);
icount -= 1;
}while(icount >= 0);
2、赋值语句的特殊写法
printf(“x=8的值是%d”, x=8);
int a = 3, b = 4;
int x;
if ( (a = b) > 0)
x = 4;
3、数据的输出
putchar(c)
: 向屏幕输出一个字符,只能输出字符。c可以是个字符型变量,也可以是个整形变量。
#include< >
:预编译命令,作用就是将某些文件包含到用户的源文件中,也就相当于把某个文件中的内容原封不动的贴到这个位置。
#include <stdio.h> //<>是去系统目录中找头文件
#include “stdio.h” //“”在当前目录中查找,找不到再到系统中查找。“”用于自己写的头文件,让系统优先使用当前目录中定义的头文件
stdio.h
//标准的I/O库;stdio.h
叫头文件(head)
printf()
函数:向屏幕输出若干任意类型的数据。
格式:printf(格式控制,输出表列);
**格式控制:**用双引号扩起来的字符串。
格式字符:
-
%d
:以十进制数形式输出一个数字; -
%o
:以八进制数形式输出一个数字; -
%x
:以十六进制数形式输出一个数字; -
%c
:以字符形式输出一个数字; -
%f
:以浮点数形式输出一个数字; -
%u
:以十进制数形式输出一个unsigned型(正数)数据; -
%s
:输出一个字符串;(string)
printf
中显示%
-
printf("5%%");
-
printf("5%c",'%');
-
printf("5%s","%");
4、数据的输入:从键盘上输入数据。
getchar()
:执行后等待用户从键盘上输入一个字符,并按回车后程序继续执行。
scanf
函数,这是个格式化输入函数,用来输入任何类型的多个数据;
格式:
scanf(格式控制,地址表列);
当输入回车的时候表示输入结束。
int a, b, c;
scanf_s(“%d%d%d”,&a,&b,&c); //&是地址运算符(表示该变量在内存中的地址),表示键盘输入的数据放在a, b, c的地址中。三个输入的数字 之间可以用空格,回车,tab分隔,不能用逗号分隔。
printf(“a+b+c=“,a+b+c);
三 逻辑运算和判断选择
1、关系运算符,关系表达式,逻辑运算符,逻辑表达式
1)关系运算符和关系表达式
关系表达式:用关系运算符将两个表达式连接起来的式子就叫关系表达式。
关系表达式的值是一个逻辑值,“True(1)”和“False(0)”(布尔值),关系表达式的值是0或者1,也可以认为是True或者False。
2)逻辑运算符和逻辑表达式
用逻辑运算符 将 关系表达式 连接起来的 就是逻辑表达式。
双目运算符:要求有两个运算量,分别位于符号两侧。
比如(a > b) && (c > d);
(a > b) || (c > d);
!非
是一个单目运算符。比如:! (a > 3);
a && b
: 若a和b都为真,则输出为True(1);
a || b
: 若a和b有一个为真,则输出为真;
计算机在进行逻辑判断时,不等于0的值全部认为True
总结来说:由系统给出的逻辑运算结果不是0就是1,不可能是其他数值♂️,而在逻辑表达式中作为参加逻辑运算的运算对象,是0就表示假,非0就表示真。
if(4 == true) //假;因为计算机默认true为1
if(4 && 5) //真,式中4和5都属于逻辑表达式中的运算对象且都不等于0。
逻辑运算符求值问题:在逻辑表达式求解中,不是所有逻辑运算符都会被执行,只有在必须执行下一个逻辑运算符才能求出表达式的结果时,才执行该运算符。
a && b && c //只有a为真(非0)才需要判断b,只有a,b都为真才判断c。
a || b || c //只要a为真就不需要判断b和c,只有a,b都不为真才会判断c。
2、if语句详解
1)if常用的三种结构
if语句(选择结构的代表性语句):用来判断给定的条件是否满足,根据判断的结果(真,假)决定执行给出的两种操作之一。
if 的三种格式:
if (表达式) 语句
如果表达式中的条件满足则执行该语句。
⚠️千万不要在if (条件)后加冒号或分号(和PYTHON有差别),加上后会破坏掉选择关系。
if (表达式) 语句1 else 语句2
如果表达式中的条件满足,则执行语句1;否则执行语句2。
if (表达式1) 语句1 // 如果表达式1成立执行语句1...只能执行一个语句!
else if (表达式2) 语句2
else if (表达式3) 语句3
...
else (表达式n) 语句n
2)if语句的嵌套
if ()
if() 语句1