C语言是有史以来最为重要编程语言,写外挂、做黑客必须掌握的语言。
C/C++是永远不过时的贵族语言,除了纯应用的公司 C/C++市场需求量大,职位数量多,仅次于Java。
适用领域?
C语言可以写网站后台,写出绚丽的GUI界面,C语言可以写出大型游戏的引擎,C语言可以写操作系统和驱动程序,并且只能用C语言
编写,linux操作系统的全部源代码都可以在网上找到,深入了解操作系统的运行秘密,懂C语言就能看懂。
C语言是语法最简单的语言。
32个关键字和9种语句,34个运算符,一天写300行代码。(坚持敲代码),多学习一些优秀代码。
学习目标:1.具有一定的编程能力,具有一定的调试能力,所有的C语言语法,关键字,操作符倒背如流,运行如飞。
2.掌握编程技巧和简单算法,具备解决问题的能力。
3.成功应对世界5百强C语言面试的一系列问题。
小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
基本数据类型:整型(上)
1.整型 int
C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负。int 是整型之一,一般被称为整型。
int 代表有符号整数,也就是说,用 int 声明的变量可以是正数,可以是负数,也可以是零,但是只能是整数。标准规定 int 的最小取值范围是-32767到32767。int 的取值范围因机器而异,但是一定要大于或者等于-32767到 32767。一般来说,int 占用一个字的内存空间。因此,字长为 16 位的旧式 IBM 兼容机使用 16 位来储存整型 int ,取值范围是-32768到32767。目前的个人电脑一般都是 32 位字长的,这些电脑中,int一般也是32位的,取值范围是 -2147483648到 2147483647 。对于使用 64 位 CPU 的电脑,使用更多字节储存 int 也是很自然的事情,取值范围当然也会更大。
2.声明 int 类型的变量
正如我们在以前的教程里看到的那样,int 用于声明整型变量:以 int 打头,后面跟着变量的名字,最后以分号(;)结束。例如:
int erns;/* 声明一个变量 */
/* 注意:一定要用逗号(,),不能用分号(;)*/
int hogs, cows, goats;/* 声明三个变量 */
以上声明创建了变量,但是没有给它们提供“值(value)”。在前面的教程中,我们已经用了两种方法使变量获得“值”。一种是赋值:cows = 500; 。另一种是使用 scanf 函数:scanf( "%d", &goats ); 。下面我们来学习第三种方法。
3.初始化变量
初始化变量是指给变量赋初值:声明变量的时候,在变量名的后面写上等号(=),然后写下你希望赋予变量的“值”。例如:
int hogs = 21;
int cows = 32, goats = 14;
int dogs, cats = 94;
以上声明创建了变量,并且为这些变量分配了空间,同时也赋了初值。注意,第三行中只有 cats 被初始化为 94,而 dogs
没有被初始化!如下图:
4.int 常量
上面的例子中,21、32、14,以及 94 都是整数常量。C 语言中,整数常量的默认类型是 int ,也就是说,整数常量占用内存空间的大小一般等于 int 类型的变量占用空间的大小。如果整数常量的大小超过了 int 的取值范围,那么编译器将会把这个整数常量当作 long int 类型来处理,这个我们后面还会讲到。
21、32、14 和 94 都在 int 的取值范围之内,因此它们都是 int 常量。
5.输出 int 型数据
我们可以用 printf 函数来输出 int 型数据。正如我们在前面的教程中看到的那样,占位符 %d 代表输出的是 int 型数据,它告诉 printf 函数在什么地方输出相应的 int 型数据。%d 也被称为格式限定符(format specifier),因为它指定了 printf 函数应该使用什么形式来输出数据。printf 函数的第一个参数只能是字符串,这个字符串被称为格式串(format string)。格式串中有多少个 %d,我们就应该相应地提供多少个 int 型参数给 printf 函数。int 型参数可以是 int 型变量,int 型常量,以及结果为 int 型的表达式等。例如:
int year = 2005;/* year 是 int 型变量
*/
printf( "Today is %d-%d-%d\n", year, 9, 20 + 9 );/* 20 + 9 是加法表达式 */
保证格式限定符的数目和参数数目一致是我们的责任,编译器不负责捕捉这种错误!例如:
#include<stdio.h>
int main(void)
{
int ten = 10, two = 2;
printf("%d minus %d is %d\n", ten );/*
少写了两个参数 */
getchar();/* 等待用户按回车
*/
return 0;
}
这个程序可以通过编译,但是运行结果将会出乎意料,因为我们少写了两个参数。第一个 %d 被参数 ten 的值代替,而另外两个 %d
将被内存中本来储存着的值代替。因为内存中本来储存着的值是不确定的,所以输出结果是不确定的。
小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
6.八进制(octal)和十六进制(hexadecimal)
C 语言中,整数常量默认是十进制(decimal)整数。通过在整数常量前面加上特定的前缀,可以把它设定为八进制或者十六进制整数。前缀0x或者0X把整数常量设定为十六进制整数。注意,是数字 0 ,而不是字母 O ,别搞错了哦!例如:十进制的 16 用十六进制来表示是 0x10 或者 0X10 。在整数常量前面加上前缀0,表示它是八进制整数。注意,是数字 0 ,而不是字母 O 。例如:十进制的 16 表示为八进制就是 020 。
7.以八进制或者十六进制形式输出数据
使用格式限定符%o可以以八进制的形式输出整数。注意,是小写字母 o ,不是数字 0 。使用%x或者%X可以以十六进制的形式输出整数。小写 x 表示输出使用小写字母,大写 X 表示输出使用大写字母。使用 %#o,%#x 或者 %#X,得到的输出将包括前缀 0,0x 或者 0X。例如:
#include<stdio.h>
int main(void)
{
int x = 200;
printf("dec = %d; octal = %o; hex = %x; HEX = %X\n", x, x, x, x);
printf("dec = %d; octal = %#o; hex = %#x; HEX = %#X\n", x, x, x, x);
getchar();
return 0;
}
这个程序的输出是:
dec = 200; octal = 310; hex = c8; HEX = C8
dec = 200; octal = 0310; hex = 0xc8; HEX = 0XC8
11.
基本数据类型:整型(中)
1.其它整数类型
int 是 C 语言的基本整数类型,可以满足我们处理一般数据的需求。C 语言还提供了四个可以修饰int的关键字:short、long、signed,以及unsigned。利用这四个关键字,C 语言标准定义了以下整数类型:
1) short int(可简写为 short),和 int 一样,也是有符号整数
2) long int(简写:long),有符号整数
3) long long int(简写:long long),C99 标准添加的类型,
有符号整数
4) unsigned int(简写:unsigned),无符号整数,不能表示负数
5) unsigned long int(简写:unsigned long),无符号整数,
不能表示负数
6) unsigned short int(简写:unsigned short),无符号整数,
不能表示负数
7) unsigned long long int(简写:unsigned long long),
C99 添加的类型,无符号整数
8) 所有没有标明 unsigned 的整数类型默认都是有符号整数。
在这些整数类型前面加上 signed 可以使读者更清楚地知道
这些是有符号整数,尽管有没有 signed 都表示有符号整数。
例如:signed int 等同于 int 。
一般我们把 short 称为短整型,把 long 称为长整型,把 long long 称为超长整型,把 int 称为整型。unsigned 打头的那些整数类型统称为无符号整型。例如:我们称 unsigned short 为无符号短整型。以此类推。
小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
2.声明方式
这些整数类型的声明方式与 int 类型的声明方式一样。例如:
long int estine;
long johns;
short int erns;
short ribs;
unsigned int s_count;
unsigned players;
unsigned long headcount;
unsigned short yesvotes;
long long ago;/* C99 特有 */
unsigned long long ego;/* C99 特有
*/
如果您的编译器不支持C99标准,那就不能使用long long和unsigned long
long。
3.取值范围(表示范围)
标准也规定了这些整数类型的最小取值范围。short 的最小表示范围和 int 一样,都是 -32767 到 32767 。也就是 -(2^15 - 1)到(2^15 - 1)。其中,2^15表示 2 的 15 次方。类似地,2 的 20 次方记作 2^20 ,以此类推。注意:C 语言中 2^15 并不表示 2 的 15 次方,为了书写方便,我们姑且这么表示。long 的最小取值范围是 -2147483647 到 2147483647 。也就是 -(2^31 - 1) 到
(2^31 - 1) 。unsigned short的最小表示范围和unsigned int 一样,都是 0 到 65535(2^16 - 1)。unsigned long 的最小取值范围是 0 到 4294967295(2^32 - 1)。long long的最小取值范围是 -9223372036854775807(-(2^63 - 1))到 9223372036854775807(2^63 - 1);unsigned long long 是 0 到
18446744073709551615(2^64 - 1)。
标准规定,int 的表示范围不能小于short 的表示范围,long 的表示范围不能小于int 的表示范围。这就是说 short 型变量占用的空间可能比 int 型变量少,而 long 型变量占用的空间可能比 int 型变量多。16 位(bit)的计算机中,int 和 short 一般都是 16 位,而 long 是 32位;32位的计算机中,short一般是 16 位,而long和int是 32位。TC2(16位的编译器)中,int是16位的;而 Dev-C++(32 位的编译器)中,int 是 32 位的。
使用 unsigned int 声明的变量只能表示正整数。如果 int 是 16 位的话,那么 unsigned int 的表示范围是 0 到65535(2^16 - 1)。这是因为unsigned 不需要符号位,可以把 16 个位全都用于表示整数。而 int 需要一个位作为符号位,用于表示正负,只有 15 个位用于表示整数。
目前,long long 一般 64 位,long 是 32 位,short 是 16 位,而 int 或者 16 位,或者 32 位。具体某个编译器到底使用多少位来表示这些类型,我们可以用运算符sizeof 来获取。例如:
printf( "%lu\n", (unsigned long)sizeof(int) * 8 );/* 输出 int 的位数 */
printf( "%zu\n", sizeof(short) * 8 );/* 输出 short 的位数 */
sizeof 的用法我们以后会讲到,现在只要有个印象就好了。第二句中的%zu是 C99 特有的,如果您的编译器不支持 C99(准确地说,应该是如果您的编译器使用的库函数不支持
C99),运行结果将会出错。
4.整数类型的选择
如果您要处理的只是正整数,那么应该优先使用 unsigned 打头的那些整数类型。如果您要处理的整数超出了int所能表示的范围,并且您的编译器中,long的表示范围比 int
大,那就使用 long 。不过,若非必要,尽量不要用 long
,因为它可能会降低程序运行效率。有一点要注意:如果您的编译器中,long和int都是32位的,并且您需要使用32位整数,那么应该用long,而不要用int。只有这样,我们的程序才可以安全地移植到16位的计算机,因为 16位的计算机中,int
一般也是16位的。类似地,如果您需要使用64位整数,那就用 long long。如果 int 是 32 位的话,那么使用
short 可以节省空间,不过您得确保您要处理的整数不会超出 short 的表示范围。这种“节省”对内存大的计算机来说,是没什么意义的。
5.long 型常量和 long long 型常量
一般来说,整数常量是被当作 int 类型来存储的。如果我们使用的整数常量超出了 int 的表示范围,C 语言规定编译器自动使用 unsigned int 来处理这个常量。如果 unsigned也不足以表示这个常量的话,编译器就会用long 。如果还表示不了的话,那就依次用unsigned long,long long,unsigned long long。如果unsigned long long也表示不了,那么编译器就没辙了。注意:long long 和unsigned long long 是 C99 特有的。例如:如果 int 是 16
位的话,它就表示不了常量 1000000。编译器会使用 long 来处理这个常量,因为 unsigned int 也表示不了 1000000 。
同样,十六进制和八进制整数常量通常也是被作为 int 来处理。但是,当我们使用的常量超出了
int的表示范围后,编译器会依次使用unsigned int,long,unsigned long,long long 和 unsigned long long。直到所使用的类型足以表示那个常量为止。
有时,我们使用的是较小的常量,但是我们希望这个常量被当作 long 来处理,这就需要在这个
常量后面加上后缀l(小写字母 l)或者 L(大写字母 L)。我们应该避免使用 l ,因为 l 容易和数字 1 混淆。例如:整数常量 7 是被作为 int 来处理的,但整数常量 7L(或者 7l)是被作为 long 来处理的。类似地,在整数常量后面加上后缀 ll 或者 LL ,这个常量就会被当作 long long 来处理。例如:3LL 。如果想使用无符号整数常量的话,还要配合使用后缀 u 或者 U
。例如:2u,3U,4Lu,5ul,6LU,7LLU,8Ull,9uLL 。
这些后缀也可以用于十六进制和八进制整数常量。例如:020L,010LL,
0x30uL,0x40ull 。
几点学习建议:
1.基本概念很重要。无论学C,还是学C++,基本概念都是第一位的,也是比较困难的,但只有把握了基本概念才能把握整体脉络,
才能居高临下。
2.C是C++的子集,它的基本概念和设计方法相对比较容易理解,初学者可从它入手。
3.如果要学好C++,建议初学者最好别在如VC,BCB平台下写程序,那种自动化的代码生成,花花绿绿的界面,会让你手足无措。最
好先找一片空地(unix,dos),从头做起,写几个大点的程序,数个回合,再到VC,BCB下看看,你会轻松得很。在我看来,学好
C/C++是成为VC,BCB高手的必由之路。
4.不要妄想速成,必须得一个byte,一个bit的去抠,尽量搞清楚每一个问题。