上火的旧文章,C语言基础1/2


C语言程序结构


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等.


用整数玩转printf


上节说到:我们使用了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函数的一般格式为:

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可以实现的输出格式,我们发现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


在printf中玩转转义字符


不是任意字符都可以被程序识别,比如圆周率π

通常我们使用ASCII字符集,但是ASCII字符中有一些字符无法直接显示或输入,输出这些字符我们就需要使用转义字符

在之前我们已经遇见了转义字符\n换行,那么还有哪些转义字符呢?

转义字符见下表:

转义字符 实际意义
\\ 代表一个反斜杠\
\n 换行
\0 空字符null
\a 警告
\b 退格Backspace
\r 回车Enter
\f 换页
\t 水平制表符
\v 垂直制表符
\' 代表一个单引号'
\" 代表一个双引号"
\? 代表一个问号?
\ooo 1到3位八进制数所代表的任意字符
\xhh 1到2位十六进制所代表的任意字符