上火的旧文章,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无符号基本整型20至65535
unsigned int无符号基本整型40至4294967295
short短整型2-32768至32767
unsigned short无符号短整型20至65535
long长整型4-2147483648至2147483647
unsigned long无符号长整型40至4294967295
long long双长整型8-9923372036854775808至9923372036854775807
unsigned long long无符号双长整型80至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类型的精准度造成的,具体浮点数(小数)见下表

类型有效数字字节范围
float641.2E-38到3.4E+38
double1582.3E-308到1.7E+308
long double1582.3E-308到1.7E+308
long double19163.4E-4932到1.1E+4932


在printf中玩转转义字符


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

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

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

转义字符见下表:

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