1972年,贝尔实验室的丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(KenThompson)在开发UNIX操作系统时设计了C语言。然而,C语言不完全是里奇突发奇想而来,他是在B语言(汤普逊发明)的基础上进行设计。至于 B语言的起源,那是另一个故事。C 语言设计的初衷是将其作为程序员使用的一种编程工具,因此,其主要目标是成为有用的语言。虽然绝大多数语言都以实用为目标,但是通常也会考虑其他方面。例如,Pascal 的主要目标是为更好地学习编程原理提供扎实的基础;而BASIC的主要目标是开发出类似英文的语言,让不熟悉计算机的学生轻松学习编程。这些目标固然很重要,但是随着计算机的迅猛发展,它们已经不是主流语言。然而,最初为程序员设计开发的C语言,现在已成为首选的编程语言之一。C语言有如下优点。
现在我们写第一个C代码,代码详情见下。
#include<stdio.h>
int main(void)
{
int num;
num = 520;
printf("Hello world!");
printf("This is my first code!\n");
printf("Lucky number is %d!\n",num);
return 0;
}
运行结果见下图。
现在让我们逐一解释各个语句的意义。
#include<stdio.h>
这是程序的第1行。#include 的作用相当于把stdio.h文件中的所 有内容都输入该行所在的位置。实际上,这是一种“拷贝-粘贴”的操作。 include 文件提供了一种方便的途径共享许多程序共有的信息。
#include这行代码是一条C预处理器指令(preprocessor directive)。通 常,C编译器在编译前会对源代码做一些准备工作,即预处(preprocessing)。 所有的C编译器软件包都提供stdio.h文件。该文件中包含了供编译器使 用的输入和输出函数(如, printf())信息。该文件名的含义是标准输入/输 出头文件。通常,在C程序顶部的信息集合被称为头文件(header)。在大多数情况下,头文件包含了编译器创建最终可执行程序要用到的信 息。例如,头文件中可以定义一些常量,或者指明函数名以及如何使用它 们。但是,函数的实际代码在一个预编译代码的库文件中。简而言之,头文 件帮助编译器把你的程序正确地组合在一起。
int main(void)
{
语句;
}
main是一个极其普通的名称,但是这是唯一的选择。C程序一定从main()函数开始执行(目前不必考虑例外的情况)。除了main()函数,你可以任意命名其他函数,而且main()函数必须是开始的函数。圆括号有什么功能?用于识别main()是一个函数。很快你将学到更多的函数。就目前而言,只需记住函数是C程序的基本模块。int是main()函数的返回类型。这表明main()函数返回的值是整数。通常,函数名后面的圆括号中包含一些传入函数的信息。该例中没有传 递任何信息。因此,圆括号内是单词void(第11章将介绍把信息从main()函 数传回操作系统的另一种形式)。
int num;
这行代码叫作声明(declaration)。声明是C语言最重 要的特性之一。在该例中,声明完成了两件事。其一,在函数中有一个名为 num的变量(variable)。其二,int表明num是一个整数(即,没有小数点或 小数部分的数)。int是一种数据类型。编译器使用这些信息为num变量在内 存中分配存储空间。分号在C语言中是大部分语句和声明的一部分。 int是C语言的一个关键字(keyword),表示一种基本的C语言数据类 型。关键字是语言定义的单词,不能做其他用途。例如,不能用int作为函数 名和变量名。但是,这些关键字在该语言以外不起作用,所以把一只猫或一 个可爱的小孩叫int是可以的(尽管某些地方的当地习俗或法律可能不允 许)。 示例中的num是一个标识符(identifier),也就一个变量、函数或其他 实体的名称。因此,声明把特定标识符与计算机内存中的特定位置联系起 来,同时也确定了储存在某位置的信息类型或数据类型。 在C语言中,所有变量都必须先声明才能使用。这意味着必须列出程序 中用到的所有变量名及其类型。 以前的C语言,还要求把变量声明在块的顶部,其他语句不能在任何声 明的前面。
- C变量命名规则:1.以数字,字母,下划线组合2.只能以字母、下划线开头3.以单下划线开头一般为隐藏函数或者变量
-
num = 520;
赋值是C语言的基本操作 之一。该行代码的意思是“把值1赋给变量num”。在执行int num;声明时,编 译器在计算机内存中为变量num预留了空间,然后在执行这行赋值表达式语 句时,把值储存在之前预留的位置。可以给num赋不同的值,这就是num之 所以被称为变量(variable)的原因。注意,该赋值表达式语句从右侧把值 赋到左侧。另外,该语句以分号结尾。
-
printf("Hello world!"); printf("This is my first code!\n"); printf("Lucky number is %d!\n",num);
这3行都使用了C语言的一个标准函数:printf()。圆括号表明printf是一 个函数名。圆括号中的内容是从main()函数传递给printf()函数的信息。例 如,上面的第1行把Hello world!传递给printf()函数。该信息被称为参数,或 者更确切地说,是函数的实际参数(actual argument),〔在 C语言中,实际参数(简称实参)是传递给函数的特定值,形式参数(简称 形参)是函数中用于储存值的变量。〕printf()函 数用参数来做什么?该函数会查看双引号中的内容,并将其打印在屏幕上。
第1行printf()演示了在C语言中如何调用函数。只需输入函数名,把所需的参数填入圆括号即可。当程序运行到这一行时,控制权被转给已命名的函 数(该例中是printf())。函数执行结束后,控制权被返回至主调函数 (calling function),该例中是main()。
第2行printf()函数的双引号中的\n字符并未输出。这是为什么?\n的意思 是换行。\n组合(依次输入这两个字符)代表一个换行符(newline character)。对于printf()而言,它的意思是“在下一行的最左边开始新的一 行”。也就是说,打印换行符的效果与在键盘按下Enter键相同。既然如此, 为何不在键入printf()参数时直接使用Enter键?因为编辑器可能认为这是直接 的命令,而不是储存在在源代码中的指令。换句话说,如果直接按下Enter 键,编辑器会退出当前行并开始新的一行。但是,换行符仅会影响程序输出 的显示格式。 换行符是一个转义序列(escape sequence)。转义序列用于代表难以表 示或无法输入的字符。如,\t代表Tab键,\b代表Backspace键(退格键)。每 个转义序列都以反斜杠字符(\)开始。第3个printf()还有一些不明之处:参数中的%d在打印时有什么作用?先 来看该函数的输出Lucky number is 520!对比发现,参数中的%d被数字520代替了,而520就是变量num的值。%d相 当于是一个占位符,其作用是指明输出num值的位置。
-
return 0;
int main(void)中的int表明 main()函数应返回一个整数。C标准要求main()这样做。有返回值的C函数要 有return语句。该语句以return关键字开始,后面是待返回的值,并以分号结 尾。如果遗漏 main()函数中的 return 语句,程序在运行至最外面的右花括号 (})时会返回0。因此,可以省略main()函数末尾的return语句。但是,不要 在其他有返回值的函数中漏掉它。因此,强烈建议读者养成在 main()函数中 保留 return 语句的好习惯。在这种情况下,可将其看作是统一代码风格。
{
}
花括号把main()函数括起来。一般而言,所有的C函数 都使用花括号标记函数体的开始和结束。这是规定,不能省略。只有花括号 ({})能起这种作用,圆括号(())和方括号([])都不行。 花括号还可用于把函数中的多条语句合并为一个单元或块。
/*
hello,my name is jim!
*/
//This is a comment
/*This is a comment*/
/*
Facing the sea,
spring blossoms
*/
在程序中,被/* */两个符号括起来的部分是程序的注释。写注释能让他 人(包括自己)更容易明白你所写的程序。C 语言注释的好处之一是,可将 注释放在任意的地方,甚至是与要解释的内容在同一行。较长的注释可单独 放一行或多行。在/*和*/之间的内容都会被编译器忽略。
// 这种注释只能写成一行。
第一次代码实战:
千克转换从磅数:
#include<stdio.h>
int main(void)
{
float scale,mass,pound;
scale = 2.204;//比例
mass = 1;//Kiogram
pound = scale*mass;
printf("%.2f kiogram equals %.2f pounds\n",mass,pound);
return 0;
}
计算100~200质数:
#include<stdio.h>
int main()
{
int m, i;
printf("The prime numbers from 100 to 200 are :\n");
for (m = 100; m <= 200; m++)
{
for (i = 2; i <=m-1; i++)
{
if (0 == m % i)
break;
}
if (i >= m)
printf("%d ", m);
}
return 0;
}
计算已经活了多少天:
//计算年龄,单位天
#include "stdio.h"
int main(void)
{
int age;
printf("Please enter your age:");
scanf("%d",&age);
printf("This is age's address:%p\n",&age);
printf("You've been alive for %d days \n",age*365);
return 0;
}
计算已经活了多少天(带闰年):
//带闰年
#include<stdio.h>
int main(void)
{
int age_1 = 0;
int age_2 = 0;
int count = 0;
int temp = 0;
printf("age_1:\n");
scanf("%d",&age_1);
printf("age_2:\n");
scanf("%d",&age_2);
temp = age_1;
for(;age_1<=age_2;age_1++)
{
if(age_1%4==0)
{
count++;
}
}
temp = (count*366+(age_2-temp)*365);
printf("age are %d:\n",temp );
}