菜鸟教程之C语言基础(上)

菜鸟教程之C语言基础(上)

 

一、前言:

前几天,在看另一个教程视频,总感觉太啰嗦,讲的东西不符合我想要的。

这里,通过菜鸟教程,看一遍文档,打一遍笔记,想通过这样学一下C语言的基础。

感谢菜鸟教程。

 

二、笔记:

 1、C程序结构:

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5         printf("hello world!\n");
  6         return 0 
  7 }

 C程序主要包括几部分

预处理指令

函数

变量

语句或表达式

注释

 

2、C基本语法

C程序由各种令牌组成(关键字、标识符、常量、字符串值、符号)

(1)分号

(2)注释

(3)标识符

(4)关键字

 

关键字说明
auto 声明自动变量
break 跳出当前循环
case 开关语句分支
char 声明字符型变量或函数返回值类型
const 声明只读变量
continue 结束当前循环,开始下一轮循环
default 开关语句中的"其它"分支
do 循环语句的循环体
double 声明双精度浮点型变量或函数返回值类型
else 条件语句否定分支(与 if 连用)
enum 声明枚举类型
extern 声明变量或函数是在其它文件或本文件的其他位置定义
float 声明浮点型变量或函数返回值类型
for 一种循环语句
goto 无条件跳转语句
if 条件语句
int 声明整型变量或函数
long 声明长整型变量或函数返回值类型
register 声明寄存器变量
return 子程序返回语句(可以带参数,也可不带参数)
short 声明短整型变量或函数
signed 声明有符号类型变量或函数
sizeof 计算数据类型或变量长度(即所占字节数)
static 声明静态变量
struct 声明结构体类型
switch 用于开关语句
typedef 用以给数据类型取别名
unsigned 声明无符号类型变量或函数
union 声明共用体类型
void 声明函数无返回值或无参数,声明无类型指针
volatile 说明变量在程序执行中可被隐含地改变
while 循环语句的循环条件

 

3、数据类型:

在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。

变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。

 

C语言有4种数据类型:

(1)基本类型:

算术类型(整数类型、浮点类型)

(2)枚举类型:

算术类型(被用来定义在程序中只能赋予其一定的离散整数值的变量)

(3)void类型:

(4)派生类型:

指针类型、数组类型、结构类型、共用体类型和函数类型

PS:数组类型和结构类型统称聚合类型,函数类型指的是函数返回值的类型。

 

(5)整数类型+浮点类型:

 

关于标准整数类型的存储大小和值范围的细节:

类型存储大小值范围
char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

  

关于浮点类型的存储大小和值范围的细节:       

类型存储大小值范围精度
float 4 字节 1.2E-38 到 3.4E+38 6 位小数
double 8 字节 2.3E-308 到 1.7E+308 15 位小数
long double 16 字节 3.4E-4932 到 1.1E+4932 19 位小数

 

void 类型指定没有可用的值。它通常用于以下三种情况下:

序号类型与描述
1 函数返回为空
C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status);
2 函数参数为空
C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void);
3 指针指向 void
类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。

 

4、变量:

(1)概念:

变量是程序可操作的存储空间的名称。

C中每个变量都有其特定类型,类决定了变量存储的大小和布局(指定范围内的值都可以存储到内存中,运算符作用变量上)

变量的名称可以由字母、数字和下划线字符组成。
它必须以字母或下划线开头。
大写字母和小写字母是不同的,
C 是大小写敏感的。

(2)变量类型:

char(一个字节,整数类型)、int、float(单精度浮点值)、double(双精度浮点值)、void(类型缺失)

C语言中也允许定义各种其他类型的变量,如枚举、指针、数组、结构、共用体等。

(3)声明-->初始化

1)声明:

变量声明向编译器保证变量以指定类型和名称存在。

变量声明有两种情况:

A:需要建立存储空间。如int a

B:不需要建立存储空间,通过使用extern关键字声明变量名。extern int a

2)初始化:

 

5、常量:

1)常量可以是任何基本数据类型:整数常量、浮点常量、字符常量、字符串字面值,枚举常量。

2)字符常量:

转义序列含义
\\ \ 字符
\' ' 字符
\" " 字符
\? ? 字符
\a 警报铃声
\b 退格键
\f 换页符
\n 换行符
\r 回车
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八进制数
\xhh . . . 一个或多个数字的十六进制数

 

 3)定义常量:

在C中,有两种简单的定义常量的方式:

#define

const

 1 #include <stdio.h>
 2 
 3 #define A 10
 4 
 5 int main()
 6 {
 7         const int a = 10;
 8         printf("%d\n",A);
 9         print("a\n",a);
10         return 0;
11         
12 }

 

6、存储类:

(1)概念

存储类定义C程序中变量或函数的范围和生命周期。

这些说明符放置在它们所修饰的类型之前。

C程序中可用的存储类:

auto\register\static\extern

 

(2)介绍:

1)auto:是所有局部变量默认的存储类

1 {
2         int mount;
3         auto int month;//auto只能用在函数内,即只能修饰局部变量
4 }

 

2)register:用于定义存储在寄存器中而不是RAM中的局部变量。该变量的最大值等于寄存器的大小。不能对其进行一元&运算(没有内存位置)

1 {
2         register int miles;//寄存器只用有于需要快速访问的变量
3 }

 

3)static:

A:stati存储类指示编译器在程序的声明周期内保持局部变量的存在,

而不需要在每次它进入和离开作用域时进行创建和销毁,

故使用static修饰局部变量时可以在函数调用之间保持局部变量的值。

B:static也可应用在全局变量。当修饰全部变量时,会使变量的作用域限制在声明它的文件内。

全局声明一个static变量或方法可以被任何函数或方法调用,只要这些方法出现跟static变量或方法同一个文件。

C:

 1 #include <stdio.h>
 2 
 3 void func1(void);
 4 static int count=10;
 5 int main()
 6 {
 7         while(count)
 8         {
 9                 func1();
10         }
11         return 0;
12 }
13 void func1(void)
14 {
15         static int thingy=5;
16         thingy++;
17         printf("thingy is %d,count is %d\n",thingy,count);
18 }
19 ~  

 

 

4)extern:

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。

当使用extern时,对于无法初始化的变量,会把变量名指向以恶搞之前定义过的存储位置。

当有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用extern来得到已定义的变量或函数的引用。

即extern是用来在另一个文件中声明一个全局变量或函数。

extern修饰符通常用于当有两个或多个文件共享相同的全局变量或函数时候。

 

 

7、运算符:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、杂项运算符

(1)算术运算符:

运算符描述实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母 B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++ 自增运算符,整数值增加 1 A++ 将得到 11
-- 自减运算符,整数值减少 1 A-- 将得到 9

 

  

(2)关系运算符:

运算符描述实例
== 检查两个操作数的值是否相等,如果相等则条件为真。 (A == B) 不为真。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 不为真。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (A < B) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 不为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为真。

 

 

(3)逻辑运算符:

运算符描述实例
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 (A && B) 为假。
|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 (A || B) 为真。
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 !(A && B) 为真。

  

(4)位运算符:

 

(5)位运算符:

运算符描述实例
&

按位与操作,按二进制位进行"与"运算。运算规则:

0&0=0;   
0&1=0;    
1&0=0;     
1&1=1;
(A & B) 将得到 12,即为 0000 1100
|

按位或运算符,按二进制位进行"或"运算。运算规则:

0|0=0;   
0|1=1;   
1|0=1;    
1|1=1;
(A | B) 将得到 61,即为 0011 1101
^

异或运算符,按二进制位进行"异或"运算。运算规则:

0^0=0;   
0^1=1;   
1^0=1;  
1^1=0;
(A ^ B) 将得到 49,即为 0011 0001
~

取反运算符,按二进制位进行"取反"运算。运算规则:

~1=0;   
~0=1;
(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<< 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 A << 2 将得到 240,即为 1111 0000
>> 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

  

(6)赋值运算符:

 

运算符描述实例
= 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A
-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C - A
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
|= 按位或且赋值运算符 C |= 2 等同于 C = C | 2

 

  

(7)杂项运算符:

运算符描述实例
sizeof() 返回变量的大小。 sizeof(a) 将返回 4,其中 a 是整数。
& 返回变量的地址。 &a; 将给出变量的实际地址。
* 指向一个变量。 *a; 将指向一个变量。
? : 条件表达式 如果条件为真 ? 则值为 X : 否则值为 Y

  

(8)运算符的优先级:

下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,

具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。

类别 运算符 结合性 
后缀  () [] -> . ++ - -   从左到右 
一元  + - ! ~ ++ - - (type)* & sizeof  从右到左 
乘除  * / %  从左到右 
加减  + -  从左到右 
移位  << >>  从左到右 
关系  < <= > >=  从左到右 
相等  == !=  从左到右 
位与 AND  从左到右 
位异或 XOR  从左到右 
位或 OR  从左到右 
逻辑与 AND  &&  从左到右 
逻辑或 OR  ||  从左到右 
条件  ?:  从右到左 
赋值  = += -= *= /= %=>>= <<= &= ^= |=  从右到左 
逗号  从左到右 

  

8、判断:C语言把任何非零和非空的值定为true,把零和null定为false

(1)if:

 1 #include <stdio.h>
 2 int main()
 3 {
 4         int a = 10;
 5         if(a < 20)
 6         {
 7            printf("a < 20\n");
 8         }
 9         printf("a is %d\n\n",a);
10         return 0;
11 }

  

(2)if else:

 1 #include <stdio.h>
 2 int main()
 3 {
 4         int a = 10;
 5         if(a < 20)
 6         {
 7                 printf("a < 20\n");
 8         }
 9         else{
10                 printf("a > 20\n",a);
11         }
12         printf("a is %d\n",a);
13         return 0;
14 }
15 ~ 

  

(3)嵌套if:

 1 #include <stdio.h>
 2 int main()
 3 {
 4         int a = 100;
 5         int b = 200;
 6 
 7         if(a == 100)
 8         {
 9                 if(b ==200 )
10                 {
11                         printf("a from 100 to 200\n");
12                 }
13         }
14         printf("a is %d\n",a);
15         printf("b is %d\n",b);
16         return 0;
17 } 

 

 

(4)switch:

 1 #include <stdio.h>
 2 int main()
 3 {       
 4         char grade = 'B';
 5 
 6         switch (grade)
 7         {
 8                 case 'A':
 9                         printf("nice\n");
10                         break;
11                 case 'B':
12                         printf("not bad\n");
13                         break;
14                 default:
15                         printf("well\n");
16         }
17         printf("your grade is %c\n",grade);
18         return 0;
19 }

 

 

(5)嵌套switch:

 1 #include <stdio.h>
 2 int main()
 3 {       
 4         int a =100;
 5         int b ==200;
 6         switch(a)
 7         {
 8                 case 100:
 9                         printf("this is one\n");
10                         switch(b)
11                         {
12                                 case 200:
13                                         printf("this is two\n");
14                         }
15         }
16         printf("a is %d\n",a);
17         printf("b is %d\n",b);
18         return 0;
19 
20 }

 

 

(6)三元运算符(?:)

exp1 ? exp2 : exp3;

如果exp1为真则运行exp2,否则运行exp3

1 #include <stdio.h>
2 int main()
3 {
4         int num;
5         printf("input a number:\n");
6         scanf("%d",&num);
7         (num%2==0)?print("T"):print("J");
8 }

 

 

 1 ubuntu@ubuntu:~/c_demo$ ./1
 2 input a number:3
 3 J
 4 ubuntu@ubuntu:~/c_demo$ cat 1.c
 5 #include <stdio.h>
 6 int main()
 7 {
 8     int num;
 9     printf("input a number:");
10     scanf("%d",&num);
11     (num%2==0)?printf("T\n"):printf("J\n");
12 }
13 ubuntu@ubuntu:~/c_demo$ 

 

 

9、循环:

循环:

(1)while

 1 #include <stdio.h>
 2 int main()
 3 {
 4         int a = 10;
 5         while (a < 20)
 6         {
 7                 printf("a is %d\n",a);
 8                 a++;
 9         }
10         return 0;
11 }

 

 

(2)for

1 #include <stdio.h>
2 int main()
3 {
4         for (int a=10;a< 20;a = a+1)
5         {
6                 printf("a is %d\n",a);
7         }
8         return 0;
9 }

 

 

(3)do while

 1 #include <stdio.h>
 2 int main()
 3 {       
 4         int a = 10;
 5         do
 6         {
 7                 printf("a is %d\n",a);
 8                 a = a+1;
 9         }
10         while(a < 20);
11         return 0;
12 }

 

 

(4)嵌套循环:

 1 #include <stdio.h>
 2 int main()
 3 {       
 4         int i ,j;
 5         for (1 = 2;i <100;i ++)
 6         {
 7                 for (j=2;j <=(i/j);j ++)
 8                 {
 9                         if (!(i/j))
10                                 break;
11                         if (j > (i/j)) 
12                                 printf("%d is well\n",i) ;
13                 }
14         }
15         return 0;
16 }

 

 

循环控制语句:

(1)break

 1 #include <stdio.h>
 2 int main()
 3 {       
 4         int a = 10;
 5         while (a < 20)
 6         {
 7                 printf("a is %d\n",a);
 8                 a++;
 9                 if (a >15)
10                 {
11                         break;
12                 }
13         }
14         return 0;
15 }

 

 

(2)continue

 1 #include <stdio.h>
 2 int main()
 3 {
 4         int a = 10;
 5         do
 6         {
 7                 if (a == 15)
 8                 {
 9                         a = a +1;
10                         continue;
11                 }
12                 printf("a is %d\n",a);
13                 a++;
14         }
15         while(a < 20);
16         return 0;
17 }

 

 

(3)goto:C语言中的goto语句允许把控制无条件转移到同一个函数内被标记的语句。

 1 #include <stdio.h>
 2 int main()
 3 {
 4         int a = 10;
 5         LOOP:do
 6         {
 7                 if (a ==15)
 8                 {
 9                         a = a+1;
10                         goto LOOP;
11                 }
12                 printf("a is %d\n",a);
13                 a ++;
14         }
15         while (a <20);
16         return 0;
17 }

 

 

无限循环:

 1 #include <stdio.h>
 2 int main()
 3 {       
 4         for (;;)
 5         {
 6                 printf("well");
 7         }
 8         return 0;
 9 }
10 
11 int main2()
12 {
13         while (true) //1
14         {
15                 printf("well");
16         }
17         return 0;
18 }

 

posted @ 2019-01-16 23:56  beiweisanshidu  阅读(5035)  评论(0编辑  收藏  举报