C语言程序主要包括:
预处理指令
函数
变量
语句和表达式
注释
接下来让我们看一下最基础的C语言程序HelloWorld:
#include <stdio.h>int main(){ printf("hello world\n"); /* 这一行是注释,它将被编译器忽略 */ return 0; }
程序第一行是预处理指令,告诉编译器要引用stdio.h这个文件。
下一行是主函数main()。
再之后printf()是stdio.h文件中声明的一个用来输出的函数,我们传递hello world\n给这个函数,让它实现输出hello world\n。
然后的一行是注释,注释中的内容会被编译器忽略,注释只是给程序编写者阅读的说明。
接着我们返回0,告诉系统程序正常结束。
最后的}与主函数后面的{是一个整体,在这花括号{}中包含的代码被作为了一个整体。
输入完成后运行代码将输出结果:
hello world
这里的\n被转换为了换行,因为\n在C语言中是一个转义字符,代表了无法直接输入的换行.这在后文将有专门讲解
C 语言允许两种注释方式:
1.以//开始的单行注释,这种注释以//开始,到换行符结束
2.以
/*开始,以*/结束的块注释,这种注释可以包括多行内容
但是请注意,如果您的注释属于字符串的一部分,即在" "和' '中的//和/* */将被作为字符串处理(如输出),而不是注释
将注释溶于HelloWorld的效果:
#include <stdio.h> //这是编译预处理指令int main(){ //这里定义了主函数,并且{表示了函数的开始 printf("hello world\n"); //这里输出了一些内容 return 0; //程序执行完毕返回函数值为0} //函数结束的标志
另外为了C语言程序的规范与可移植性,请将主函数main一定声明为int型,并返回值为0.不要使用某些书中不标准的写法如void main等.
上节说到:我们使用了stdio.h这个文件中的一个函数printf,实现了输出一段字符串hello world
其实printf远不止可以输出字符串,它还可以输出更多,比如变量的值,转义字符等
接下来这这个程序可以计算两个数的加法:
#include <stdio.h>int main(){ int a,b,c; //声明3个整数变量a,b,c a = 123; //设置a的值为123 b = 234; //设置b的值为234 c = a + b; //设置c的值为a+b printf("a的值为%d,b的值为%d,a加b的值为%d",a,b,c); //这里输出他们的值,其中3个%d的位置将被替换为a,b,c的值 return 0; }
运行代码后输出的结果为:
a的值为123,b的值为234,a加b的值为357
您可以把代码中的c=a+b换成c=a-b,或者乘法除法都可以,他们输出的结果分别为:
a-b时c为-111 a*b时c为28782 a/b时c为0
这里a除以b结果为0,大家可能会很好奇,那余数去哪了呢,在C语言中,余数有专门的运算符号,来求余数,这个符号就是%,现在把代码改为c=a%b试试呢...结果为123.
完整的示例(为了体现除数与余数的关系,这里将a改为了20,b改为了3):
#include <stdio.h>int main(){ int a,b,c; a = 20; b = 3; c = a + b; printf("a的值为%d,b的值为%d,a加b的值为%d\n",a,b,c); c = a - b; printf("a减b的值为%d\n",c); c = a * b; printf("a乘b的值为%d\n",c); c = a / b; printf("a除以b的值为%d\n",c); c = a % b; printf("a除以b的余数为%d\n",c); return 0; }
在C4droid中运行代码后输出的结果为:
a的值为20,b的值为3,a加b的值为23 a减b的值为17 a乘b的值为60 a除以b的值为6 a除以b的余数为2
验证一下在数学中:
20÷3=6···2
与C程序中结果相符。
这里我们所有运算都是整数类型,C语言中提供了多种整数类型,具体见下表:
类型 | 说明 | 字节 | 范围 |
---|---|---|---|
int | 基本整型 | 2 | -32768至32767 |
int | 基本整型 | 4 | -2147483648至2147483647 |
unsigned int | 无符号基本整型 | 2 | 0至65535 |
unsigned int | 无符号基本整型 | 4 | 0至4294967295 |
short | 短整型 | 2 | -32768至32767 |
unsigned short | 无符号短整型 | 2 | 0至65535 |
long | 长整型 | 4 | -2147483648至2147483647 |
unsigned long | 无符号长整型 | 4 | 0至4294967295 |
long long | 双长整型 | 8 | -9923372036854775808至9923372036854775807 |
unsigned long long | 无符号双长整型 | 8 | 0至18446744073709551615 |
在上文中,我们可以看到,printf函数的一般格式为:
printf("格式控制",输出变量列表);
这里的格式控制包括普通字符串,和要输出的变量的格式声明. 而格式声明又由%和格式字符组成,如%d
输出列表中的数据,可以是常量,变量,表达式, 这些将要输出的内容,最终均被依次替换到格式控制字符串中,对应的格式声明的位置
这里可用的格式字符见下表:
格式声明 | 说明 | 备注 |
---|---|---|
%d | 输出一个十进制整数 | 可以使用%5d这种形式指定输出数据的列数(域宽),如这里的5表示5列 |
%c | 输出一个字符 | 可以使用%5c这种形式指定输出数据的列数(域宽),如这里的5表示5列. 可以使用ASCII码作为参数,输出ASCII字符. |
%s | 输出一个字符串 | 如printf("%s","hello world");也可以输出hello world |
%f | 输出一个小数 | 可以使用%5.2f这种形式指定输出数据的列数(域宽),如printf("%1.2f",1.0/3);输出1.0除以3的结果为0.33 |
%e或%E | 以指数形式输出实数 | 此格式不常用,同样可指定域宽,如果格式中字母大写,则输出的字母为大写 |
%i | 输出一个十进制整数 | 作用与%d类似,一般使用%d |
%o | 以8进制整数形式输出 | 此格式不常用 |
%x或%X | 以16进制整数形式输出 | 此格式不常用,如果格式中字母大写,则输出的字母为大写 |
%u | 以十进制形式输出无符号数据 | 此格式不常用 |
%g或%G | 输出浮点数(小数) | 此格式不常用,由系统自行选择小数以%f或%e形式输出,如果格式中字母大写,则输出的字母为大写 |
在上文中,我们了解了printf可以实现的输出格式,我们发现printf还可以实现小数的输出,这里我们试一试
示例代码:
#include <stdio.h> int main(){ float a, b, c; //将int换成float声明数据为浮点数类型(小数),而非整数 a = 2000; b = 3.0; c = a / b; printf("a的值为%f,b的值为%f,a除以b的值为%f\n",a,b,c); printf("a除以b的值取两位小数为%.2f\n",c); return 0; }
在C4droid中运行代码后输出的结果为:
a的值为2000.000000,b的值为3.000000,a除以b的值为666.666687 a除以b的值取两位小数为666.67
这里的666.66687的8是由于超出了float类型的精准度造成的,具体浮点数(小数)见下表
类型 | 有效数字 | 字节 | 范围 |
---|---|---|---|
float | 6 | 4 | 1.2E-38到3.4E+38 |
double | 15 | 8 | 2.3E-308到1.7E+308 |
long double | 15 | 8 | 2.3E-308到1.7E+308 |
long double | 19 | 16 | 3.4E-4932到1.1E+4932 |
不是任意字符都可以被程序识别,比如圆周率π
通常我们使用ASCII字符集,但是ASCII字符中有一些字符无法直接显示或输入,输出这些字符我们就需要使用转义字符
在之前我们已经遇见了转义字符\n换行,那么还有哪些转义字符呢?
转义字符见下表:
转义字符 | 实际意义 |
---|---|
\\ | 代表一个反斜杠\ |
\n | 换行 |
\0 | 空字符null |
\a | 警告 |
\b | 退格Backspace |
\r | 回车Enter |
\f | 换页 |
\t | 水平制表符 |
\v | 垂直制表符 |
\' | 代表一个单引号' |
\" | 代表一个双引号" |
\? | 代表一个问号? |
\ooo | 1到3位八进制数所代表的任意字符 |
\xhh | 1到2位十六进制所代表的任意字符 |