目录
关于C的基本了解
C语言是一门面向过程的计算机编程语言,与C++、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
初学者了解一下C是一门面向过程的语言,广泛应用于底层开发即可。
回顾计算机语言发展,大概经历了这样一个过程:
计算机的基本单位:
bit(比特位):是最小的单位;
byte(字节):1byte=8bit,这个比较重要,下面会讲到;
再往下依次有KB,MB,GB,TB,PB
它们满足后者是前者的1024倍,如1KB=1024byte,1MB=1024KB,依次类推。
字节(byte)怎么理解呢?
我们通常会提到内存,它是计算机中的重要部件之一,计算机中所有程序的运行都在内存中运行,所以它决定了计算机整体运行快慢的程度。
而1个字节的大小就是一个内存单元的大小,把内存分隔成一块块,就像楼房里一个个住间,彼此分隔开来,互不干扰。
正文来了~
一.作用域和生命周期
1.局部变量作用域:局部变量所在局部范围
#include<stdio.h>
void test()
{
printf("%d\n",a);
}
int main()
{
int a=10;
test();
return 0;}
本程序中a是打印不出来的,a虽是在主函数中定义的,但它作为局部变量出了它的作用域(主函数内部)就没用了。
全局变量作用域:整个工程,但要注意:定义在本源文件的全局变量,在本工程的其他源文件用时,需要声明,即在前面加上关键字extern。(C语言关键字会在后面讲到)
2.生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
int main()
{
{int a=100;
printf("%d\n",a);}
printf("%d\n",a);
return 0;
}
本程序第一个a能打印,而第二个不可。第一个a所在代码块(即其所在{}内)内是a的生命周期,出了这个代码块便没用了。
对于全局变量,其生命周期是整个程序。
二.C语言中的常量
1.字面常量
顾名思义,就是从字面上就能知道其值的常量,如字符串“abcdef”,数字“1”,“3.14”等等。
2.const修饰的常变量
int main()
{
const int n=10;
printf("%d\n",n);
n=20;
printf("%d\n",n);
return 0;
}
本程序无法运行。因为n被const修饰后就具有了常属性,不可被修改,但是n本质上还是个变量,所以称为常变量。
3.#define定义的标识符常量
#include<stdio.h>
#define a 10
int main()
{
printf("%d\n",a);
return 0;
}
可以打印出结果10.
4.枚举常量(枚举关键字:enum)
enum Sex
{
MALE,
FEMALE,
SECRET
};
以上为例,其中MALE, FEMALE,SECRET为枚举常量,是Sex的内容。若对其中内容进行打印,可分别打出0,1,2三个数字。(如果想改变数字,可在内部进行初始化)
三.字符串和转义字符
1.字符串的结束标志是"\0"
即字符串默认尾部自带一个'\0'
举个栗子理解一下,如有以下字符串arr1和字符数组arr2
char arr1="abcdef";
char arr2={'a','b','c','d','e','f'};
对它们进行打印,arr1是这样的:
a b c d e f
而arr2的画风可能会像这样(?):
a b c d e f ??????= ? ????
由此,大概就能看出'\0'的重要性了吧(结束字符串,避免画风跑偏)
2.转义字符及释义
转义字符 | 释义 |
\? |
在书写连续多个问号时使用,防止他们被解析成三字母词
|
\' |
用于表示字符常量
'
|
\" |
用于表示一个字符串内部的双引号
|
\\ |
用于表示一个反斜杠,防止它被解释为一个转义序列符
|
\a |
警告字符,蜂鸣
|
\b |
退格符
|
\f |
进纸符
|
\n | 换行 |
\r | 回车 |
\t |
水平制表符
|
\v | 垂直制表符 |
\ddd | ddd表1~3个八进制数字(转换成十进制的数字对应ASCII码值) |
\xdd | dd表示2个十六进制数字 |
3.字符串长度(易错)
char arr1="abcdef";
char arr2={'a','b','c','d','e','f'};
printf("%d\n",strlen(arr1));
printf("%d\n",strlen(arr2));
printf("%d\n",sizeof(arr1));
printf("%d\n",sizeof(arr2));
上面程序打印值分别为6,随机值,7,6
strlen用来计算字符串长度,对于arr2,其在f后的字符是未知的,故无法确定;
sizeof是计算数组所占空间大小,arr1后面默认跟了个'\0',而arr2只存了a~f这6个字符。
再结合转义字符来个栗子:
strlen("c:\test\628\test.c")
分析一下:一个转义字符作为一个整体算作一个字符(\t),注意这里的\628可不是个\ddd转义字符,ddd作为八进制数,所有d必须小于8,故这里的\62算作一个转义字符,8是下一个字符。
你算出来了吗?
答案是。。。14
四.操作符(部分)
1.算式操作符: * / + -
float a=10/3; 打印结果为3.0000
float a=10/3.0; 打印结果为3.333333
2.移位操作符: << >>
移动的是二进制位,故用前要将数转换为二进制数
3.位操作符: & /\ |
4.赋值操作符
int a=10;//a的初始化
a=20;//给a赋值
5.单目操作符:
!:逻辑非运算符
举个栗子:
int a=10;
int b=!a;
printf("%d\n",b);
打印结果为0.因为C语言中0为假,非0为真,a=10不等于0为真,非a就为假。
条件语句中if(a)等价于if(a!=0);if(!a)等价于if(0==a)
~ :对一个二进制数进行按位取反
++(--):前置:先++(--),后使用
后置:先使用,后++(--)
话不多说,上个栗子:
int a=10;
int b=++a;
printf("%d %d\n",a,b);
int a=10;
int b=a++;
printf("%d %d\n",a,b);
上面打印的a和b是11,11;下面为11,10.
(类型):强制类型转换
如int a=int(3.14)
对a进行打印的结果为3
6.逗号表达式:从左向右计算,整个表达式结果是最后一个表达式结果
int a=1;int b=3;int c=4;
int d=(a=2*b,b=2*a,c=a-b);
d的结果就是表达式c=a-b的值,对d进行打印,结果为4。