C语言学习

学习网站c语言学习

c语言快速入门

C语言第一个简单实例(到底长什么样)

#include<stdio.h>
int main()
{
    int number;
    number=2014;
    printf("Hello ! I am dotcpp.com\n");
    printf("This year is %d\n",number");
    return 0;
}

运行结果

Hello ! I am dotcpp.com
This year is 2014

逐行分析

#include<stdio.h>   ///引入头文件

 本行是告诉编译器引入stdio.h文件的全部内容。stdio.h头文件是所以C语言编译器的标准部分,用来提供输入和输出的支持。

int main()   ///主函数

C语言有一个或多个函数,他们是组成C程序的基本模块。有且只有一个主函数,因为C程序的执行从main()开始,到main()的结束而停止。

{   ///函数的开始
int number;   ///定义一个number变量,他是int类型
number=2014;   ///给number赋值为2014

printf("Hello ! I am dotcpp.com\n");  ///printf函数,\n换行符

printf("This year is %d\n",number);   ///%d表示number的位置和形式
return 0;   ///提供或返回一个数值

函数名后 { 和 } 之间的部分称之为函数体

 C语言实例说明(解剖C语言)

头文件

#include<stdio.h>

这个是程序的第一行,作用为在我们的代码中该行所在的位置引入stdio.h这个文件的全部内容,更简单的说,就像一个粘贴的操作,而此刻大家应该想到,#include后尖括号<>里的文件也可以是其他头文件,没错,在今后的学习中,我们会看到更多的#include语句,其中包含了更多的头文件,这也体现了一种设计思想。可以方便的在多个程序间共享公用的信息。

#include语句是C预处理器指令(preprocessor directive)的一个例子,这些是编译器在编译代码之前要做的准备工作,称之为预处理(preprocessing)。

再来说说stdio.h这个文件,不用觉得奇怪,它和我们平常见到的123.txt并无差别,只是后缀名不同而已,这个名字表示:标准输入输出头文件,正如英文:standard input/output header,它包含了与输入输出相关的函数(比如printf)的信息,在C语言的世界中,人们称出现在文件顶部的信息集合为头(header),C实现通常都带有多个头文件。

那么,为什么C语言没有内置的输入输出语句呢?一个答案是并非所有的程序都要用到I/O(输入/输出)包,并且C语言的一个基本的设计原则就是避免不必要的成分。这个经济的使用资源的原则使得C语言在嵌入式编程中非常的流行,例如:为一个控制自动报警系统的芯片编写程序。值得一提的是,#include甚至不是C语言的语句!开头的#,这个符号表明这一行是在编译器接手之前先由C预处理器处理的语句。以后我们将碰到更多的预处理指令。

主函数 

int main()

接下来的代码声明了一个main函数。的确,main是一个极其普通的名字,但它是唯一的选择。一个C程序(我们不考虑例外的情况)总是从main()函数开始执行。我们可以对自己使用的其他函数任意命名,但是main()必须是开始的函数。每个C程序中必须有它!

那么圆括号的功能呢?它表明main()是一个函数。以后,我们将遇到更多的函数。现在,请记住这个函数就是C程序的基本模块。

int指明main()函数的返回类型。这意味着main()函数返回值的基本类型为整数。返回到哪里呢?返回给操作系统。为什么要有返回值呢?打个比方,就像皇上交代大臣去办事,大臣完成后总要复命,向皇上禀告,告诉皇上是成功还是失败。

函数名后面的圆括号一般包含传递给函数的信息。在我们这个简单的例子中没有传递任何信息,因此圆括号内包含了单词void。以后我们将看到更多传递参数的例子。

另外,您可能在一些教材或老的版本中,看到过这样的写法:
main()
这种形式在C90标准中勉强允许这种形式,在C99标准不允许,即使您的编译器允许。
以及还有这样的写法:
void main()

仅仅有些编译器允许这种形式,但还没有任何编译器考虑接受它,而有的编译器则会报错。因此,我们建议您不要这样做。另一方面,坚持使用标准形式,我们也不必担心程序从一个编译环境移到另一个编译环境上时出错的问题。

注释 

/*一个简单的C程序*/

包含在/* */之间的部分是程序注释。使用注释的目的是使人们(包括我们自己)更容易的理解我们的程序。比如,有些程序员除了用注释说明我们的代码以外,还会在代码的注释中写这一天的天气如何、心情如何等等。C语言的注释的一个好处就是可以放在任何地方,甚至是和它要解释的语句在同一行。一个较长的注释可以单放一行,或者是多行。在/*和*/之间的所有内容都会被编译器忽略掉,如: 

int number;     /* 定义一个整形变量number*/

注释也可以分成两行或多行,如: 

/*
    笔者自述:
    时间:18:24
    地点:北半球
    天气:窗外天气不明 微冷
    肚子有点饿
*/

除此之外,C99还增加另一种风格的注释,它被普遍用在C++或java里,这种新形式使用//符号,但这种注释被限制在一行里,如: 

x=10;     //将x赋值为10

花括号 

{
/*... */
}

在C程序中,通常所有的C函数都使用花括号来表示函数体的开始与结束。它们的存在是必不可少的,因此我们不能丢掉它们。并且仅有花括号{}能起到这种作用,小括号()和中括号[]都不行。花括号还可以用来把函数中的语句聚集到一个单元或代码块中。 

声明 

int num;

程序中这一行叫做声明语句(declaration statement)。该声明语句是C语言中最重要的功能之一。这个特殊的例子声明两件事情。第一,在函数中您有一个名为num的变量,第二,int说明num是一个整数,也就是说这个数没有小数部分(int是C语言的一种数据类型)。编译器使用这个信息为变量num在内存中分配一个合适的存储空间。句末的分号指明这一行是C语言的一个语句或指令,分号是语句的一部分,每个C语言都以一个分号结束。

单词int是C语言的一个关键字,代表了一种C语言的数据类型。关键字是用来表达语言的单词,您不能将他们用于其他目的。比如,不能用int用作一个函数名或者一个变量的名字。

本例中的单词num是一个标识符(identifier),也就是您为一个变量、函数或其他实体所选的名字。这样该声明就把一个特殊的标识符和计算机中的一个特殊位置联系了起来,同时也确定了该位置存储的信息类型(即数据类型),我们为这个变量赋值,也就相当于在计算机中这个特殊的位置(今后我们将清楚,这个位置即所谓的地址)赋值。因为,C语言是人和计算机沟通的纽带。

在C语言中,所有变量都必须在使用之前定义。这就意味着您必须提供程序中要用到的所有变量名的列表,并且指出每个变量的数据类型。声明变量被认为是一种好的编程技术,在C语言当中必须这样做。

传统上,C语言要求必须在一个代码块的开始处声明变量,在这之前不允许任何其他语句。也就是说,main()函数如下所示:

int main()     //traditional rules(传统的用法)
{
    int year;
    int month;
    int day;
    year = 2014;
    month = 2;
    day = 28;
    //other statements(其他的语句)
}

现在C99遵循C++的惯例,允许把声明放在代码块中的任何位置。然而,在首次使用变量之前仍然必须先声明它。因此,如果你的编译器支持这种功能,你的代码就可以像下面这样: 

int main()     //C99 rules(C99 用法)
  {
    //some statements(一些语句)
    int doors;
    doors = 5;     //first use of doors(第一次使用到的变量)
    //more statements(更多的语句)
    int dogs;
    dogs = 3;     //first use of dogs(第一次使用到的变量)
    //other statements (其他的语句)
  }

现在你可能还有三个问题。首先,数据类型是什么?第二,可以选择什么样的名字?第三,为什么必须对变量进行声明?下面来看这些问题的答案。  

1. 数据类型
C语言可以处理多个数据种类(或类型),例如整数、字符和浮点数。把一个变量声明为整数类型或字符类型是计算机正确地存储,获取和解释该数据的基本前提。在后面您将学到各种各样的可用类型。

2. 变量名的选择
您应该尽量使用有意义的变量名(例如:如果你的程序需要苹果这个变量,那么使用apple)。如果名字不能表达清楚,可以用注释解释变量所代表的意思。通过这种方式使程序更易读是良好编程的基本技巧之一。

能够使用的字符的数量与C语言的不同实现有关。C99标准允许一个标识符最多可以有 63个字符,除了外部标识符,后者只识别31个字符。与C90分别要求的31个字符和6个字符相比较,这是一个相当可观的进步,而更旧的编译器通常最多只允许8个字符。实际上,你使用的字符数量可以超过规定的最大值,但是编译器不会识别额外的字符。因此,如果一个系统最大字符数为8,那么clangdot和clangdotcc将被看作是一个名字,因为它们的前8个字符相同。

可供使用的字符有小写字母,大写字母,数字和下划线。第一个字符必须是字母或者下划线。C语言的名字是区分大小写的,即把一个大写字母和与之对应的小写字母看作是不同的。因此,clang不同于Clang或者CLANG。

 赋值 

num = 1; // =(赋值运算符)

这行程序是一个赋值语句(assignment statement)。赋值语句是C语言的基本操作之一。这个特殊的例子的意思是“把值1赋给变量num”。前面的int num;语句在计算机内存中为变量num分配了空间,该赋值语句在那个地方为变量存储了一个值。如果你想的话,以后你还可以给num赋另一个值,这就是把num称为变量的原因。可以把变量理解成是一个容器,用来盛放常量的。另外注意赋值语句赋值的顺序是从右到左。同样,该语句也用分号结束。 

printf()函数 

printf ("Hello!");
printf ("I am dotcpp.com\n");
printf ("My birthday is %d\n", num);

所有这些行都使用了C语言的一个标准函数:printf()。圆括号表明printf是一个函数名。圆括号中包含的内容是从函数main()传递到函数printf()的信息。例如,第一行把Hello!传递给printf()函数。 这样的信息被称为参数(argument),更完整的名称是函数的实际参数(actual argument)。printf()函数如何处理这个参数?程序将识别两个双引号之间的内容并把它们显示在屏幕上。

第一行printf()语句是如何在C语言中调用(call)或请求(invoke)一个函数的例子。只须键入函数的名字,把所需的一个或多个参数放进圆括号中。当程序运行到这一行时,控制权将转给该函数(在这个例子中是 printf())。当函数完成了它所要做的工作,将控制权返回给原来的函数(调用函数),在这个例子中是main()。

那么下一个printf()行呢?引号中有字符\n,但并没有输出它们!发生了什么事情呢?\n字符的意思是开始新的一行。\n组合(依次键入这两个字符)代表一个称为换行符(newline character)的字符,它意味着“在下一行的最左边开始新的一行”。换句话说,打印换行字符的效果和在普通键盘上按下回车键一样。当键入printf()这个参数时,为什么不直接按回车键呢?因为那将看作是直接针对编辑器的命令,而不是作为存在源代码中的指令。也就是说,当你按回车键时,编辑器退出你正在输入的当前行,并开始新的一行。而换行符则影响程序的输出如何显示。

换行符是转义字符(Escape Sequence)的一个例子。转义字符通常用于代表难于表达的或是无法键入的字符。其他的例子比如\t代表Tab键\b代表退格键盘。每个转义字符都用斜线字符(\)开始。

这样就解释了三个printf()语句只产生两行输出的原因:第一个printf指令中没有换行字符,而第二个和第三个都有。最后一个printf()行中又有一个奇怪的问题:当输出这一行时%d起什么作用?回忆一下,这一行的输出结果是:

My birthday is 2014

喔!当这一行输出时,数字2014被符号组合%d代替了,而1是变量 num的值。%d是一个占位符,其作用是指出输出num值的位置。

事实上,%告诉程序把一个变量在这个位置输出,d告诉程序将输出一个十进制(以10为基数)整数变量。printf()函数允许多种输出变量格式,包括十六进制(以16为基数)整数和带小数点的数。实际上,printf()中的f暗示着这是一种格式化(format)的输出函数。每一种数据都有自己的说明符,往后会有更多的说明。

return 语句

return 0;

return语句(返回语句)是程序的最后一个语句。在int main(void)中int表示main()函数的返回值应该是一个整数。C标准要求main()这样做。带有返回值的C语言函数要使用一个return语句,该语句包括关键字return,后面紧跟着要返回的值,然后是一个分号。对于main()函数来说,如果你漏掉了return语句,则大多数编译器将对你的疏忽提出警告,但仍将编译该程序。此时,你可以暂时把main()中的return语句看作是保持逻辑连贯性所需的内容。但对于某些操作系统(包括DOS和UNIX)而言,它有实际的用途。 

本教程的相关说明 

通过前面的一个简单的C程序例子,相信您已经对C程序有了一个比较好的理解,正如前面您看到的程序一样,每一个基本的程序都会有这么一个框架,这是一个C程序的基本格式,不然是无法编译通过的。包括今后出现的程序样例,您都要这么做,我们推荐您使用GCC编译器,因为它的编译要求更接近C99标准。当然您也可以在Windows系统下使用VC6、CodeBlocks、DevC++等等都可以。

关于C标准
也许您经常听人们谈论C89、C90、C99之类的名字而不知道是什么东西。简单来说,这些就是ANSI(美国国家标准局)不同年份制定的不同的国际标准,C99就是1999年制定,C90就是1990年制定,而C89就是1989年制定的咯。很明显C99要比C89要新很多,主要体现在支持了很多数据类型和新特性。为了使读者更容易入门,本教程不过多的提及这些新特性。

一些建议: 
在学习过程中,每章的程序都强烈建议您亲自上机编译测试,并建议您尝试着修改程序来体验程序每一处的作用,以这种方式加深对程序的理解。同时,我们强烈推荐您掌握不同编译器的断点调试功能,不要过分依赖printf()语句的输出结果,而要知道程序的逐条语句的执行流程,这样可以帮助您更好的了解程序。

一个C语言程序的基本机构 

通过长时间的交流发现,许多新人往往看到第一个C程序就崩溃,譬如helloworld,许多新人会觉得为何一个就输出helloword的程序怎么还有这么多行代码?各种符号在一起乱七八糟的是什么鬼?

为了便于理工科初学者理解常见的一个C程序,我总结了一个万能公式给大家:

C程序 = 主函数+m*自定义函数+n*文件包含

(其中m、n均大于等于0)

(PS:严格讲,虽说不够绝对,譬如还有全局变量和外部依赖文件等等,但初学常见的基本就是这个样子)

从公式可以看出一个C程序必须有且仅有一个主函数,因为主函数是C程序的入口点和结束点。而自定义函数和文件包含可以没有,譬如如下程序:

int main()
{
	int a=1,b=2,c=2;
	c = a+b;
	return 0;
}

这就是一个只有一个主函数的例子,并且不需要任何头文件包含。当然,m和n可以有很多,又如:

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<malloc.h>
 
int fun1()
{
	return 0;
}
int fun2()
{
	return 0;
}		
int main()
{
	return 0;
}

初学者可以自行对比公式,m和n各是多少等等,来加深理解程序结构,如此一来,我们初学着就可以先从结构上看个一二三出来

怎么样?有点帮助了吗?

C语言的数据类型 

C语言变量与常量数据(有什么区别)

在程序的世界中,可以让计算机按照指令做很多事情,如进行数值计算、图像显示、语音对话、视频播放、天文计算、发送邮件、游戏绘图以及任何我们可以想象到的事情。要完成这些任务,程序需要使用数据,即承载信息的数字与字符。

在计算机中,数据的性质和表示方式可能不同。所以需要将相同性质的数据归类,并用一定数据类型描述。任何数据对用户都呈现常量变量两种形式。常量是指程序在运行时其值不能改变的量。常量不占内存,在程序运行时它作为操作对象直接出现在运算器的各种寄存器中。变量是指在程序运行时其值可以改变的量。变量的功能就是存储数据。例子:

#include<stdio.h>
int main()
{
    int year;
    year=2014;
    printf("Welcome to www.dotcpp.com!\n");
    return 0;
}

其中year是一个int类型的变量,而2014是常量,即一个数字。 它们的区别在于,常量是恒定不变的,即2014永远表示2014不能被更改。而year是一个变量,只要是整型数字都可以赋值给year,随之year的值就会改变,旧值就会被覆盖。


变量的定义
在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。

C规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线。且不能与C语言的关键字重名(关键字见下一节)。

此外,在使用标识符时还必须注意以下几点: 
(1)标准C不限制标识符的长度,但它受各种版本的C语言编译系统限制,同时也受到具体机器的限制。例如在某版本C中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
(2)在标识符中,大小写是有区别的。例如CLANG和Clang 是两个不同的标识符。
(3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便阅读理解,做到“顾名思义”。

C语言数据类型和关键字大全 

在程序的世界中,承载一系列的信息的数字和字符都属于数据类型,但计算机需要一种方法来区别和使用这些不同的类型。具体的,C通过识别一些基本的数据类型做到这些。如果是常量数据,编译器一般通过其书写来辨认其类型,比如:123是整数,3.14浮点数(即小数)。而变量则需要在声明语句中指定其类型,稍后会做详细介绍。我们先了解C语言的基本数据类型。

基本数据类型

C语言的基本数据类型为:整型、字符型、实数型。这些类型按其在计算机中的存储方式可被分为两个系列,即整数(integer)类型浮点数(floating-point)类型。 
这三种类型之下分别是:short、int、long、char、float、double这六个关键字再加上两个符号说明符signed和unsigned就基本表示了C语言的最常用的数据类型。
下面列出了在32位操作系统下常见编译器下的数据类型大小及表示的数据范围:

类型名称类型关键字占字节数其他叫法表示的数据范围
字符型char1signed char-128 ~ 127
无符号字符型unsigned char1none0 ~ 255
整型int4signed int-2,147,483,648 ~ 2,147,483,647
无符号整型unsigned int4unsigned0 ~ 4,294,967,295
短整型short2short int-32,768 ~ 32,767
无符号短整型unsigned short2unsigned short int0 ~ 65,535
长整型long4long int-2,147,483,648 ~ 2,147,483,647
无符号长整型unsigned long4unsigned long0 ~ 4,294,967,295
单精度浮点数float4none3.4E +/- 38 (7 digits)
双精度浮点数double8none1.7E +/- 308 (15 digits)
长双精度浮点数long double10none1.2E +/- 4932 (19 digits)
长整型long long8__int64-9223372036854775808~9223372036854775808

在认识了这么多的数据类型之后,我们就可以根据不同的实际情况,在不同的问题中选择最符合的数据类型来使用。举个例子,如要计算两个数的和,我可以采用int类型定义两个变量,然后输出。

1

2

3

4

int a=24000,b=12345;//定义两个变量a,b并赋值

int c;//定义变量c用于计算a+b的和

c=a+b;

printf("a+b = %d",c);//输出结果

没错,可能您已经考虑到,如果a+b的和超出int类型的最大范围时的问题。这个就需要您根据不同的作用选择不同的数据类型存储了。
 

关键字

在C语言中,为了定义变量、表达语句功能和对一些文件进行预处理,还必须用到一些具有特殊意义的字符,这就是关键字,我们用户自己定义的变量函数名等要注意不可以与关键字同名。

C语言中的32个关键字
autodoubleintstruct
breakelselongswitch
caseenumregistertypedef
charexternreturnunion
constfloatshortunsigned
continueforsignedvoid
defaultgotosizeofvolatile
doifstaticwhile

以上关键字大家无需刻意记忆,还未遇到学习的关键字待后续教程学习即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值