在计算机中,数据的性质和表示方式可能不同。所以需要将相同性质的数据归类,并用一定数据类型描述。任何数据对用户都呈现常量和变量两种形式。
常量是指程序在运行时其值不能改变的量。常量不占内存,在程序运行时它作为操作对象直接出现在运算器的各种寄存器中。
变量是指在程序运行时其值可以改变的量。变量的功能就是存储数据。
例子:
#include<stdio.h>
int main()
{
int year;
year=2023;
printf("Hello World!\n");
return 0;
}
其中year是一个int类型的变量,而2023是常量,即一个数字。 它们的区别在于,常量是恒定不变的,即2023永远表示2023不能被更改。而year是一个变量,只要是整型数字都可以赋值给year,随之year的值就会改变,旧值就会被覆盖。
变量的定义
在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。
C规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线。且不能与C语言的关键字重名(关键字见下一节)。
此外,在使用标识符时还必须注意以下几点:
(1)标准C不限制标识符的长度,但它受各种版本的C语言编译系统限制,同时也受到具体机器的限制。例如在某版本C中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
(2)在标识符中,大小写是有区别的。例如CLANG和Clang 是两个不同的标识符。
(3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便阅读理解,做到“顾名思义”。
基本数据类型
C语言的基本数据类型为:整型、字符型、实数型。这些类型按其在计算机中的存储方式可被分为两个系列,即整数(integer)类型和浮点数(floating-point)类型。
这三种类型之下分别是:short、int、long、char、float、double这六个关键字再加上两个符号说明符signed和unsigned就基本表示了C语言的最常用的数据类型。
下面列出了在32位操作系统下常见编译器下的数据类型大小及表示的数据范围:
类型名称 | 类型关键字 | 占字节数 | 其他叫法 | 表示的数据范围 |
---|---|---|---|---|
字符型 | char | 1 | signed char | -128 ~ 127 |
无符号字符型 | unsigned char | 1 | none | 0 ~ 255 |
整型 | int | 4 | signed int | -2,147,483,648 ~ 2,147,483,647 |
无符号整型 | unsigned int | 4 | unsigned | 0 ~ 4,294,967,295 |
短整型 | short | 2 | short int | -32,768 ~ 32,767 |
无符号短整型 | unsigned short | 2 | unsigned short int | 0 ~ 65,535 |
长整型 | long | 4 | long int | -2,147,483,648 ~ 2,147,483,647 |
无符号长整型 | unsigned long | 4 | unsigned long | 0 ~ 4,294,967,295 |
单精度浮点数 | float | 4 | none | 3.4E +/- 38 (7 digits) |
双精度浮点数 | double | 8 | none | 1.7E +/- 308 (15 digits) |
长双精度浮点数 | long double | 10 | none | 1.2E +/- 4932 (19 digits) |
长整型 | long long | 8 | __int64 | -9223372036854775808~9223372036854775808 |
关键字
在C语言中,为了定义变量、表达语句功能和对一些文件进行预处理,还必须用到一些具有特殊意义的字符,这就是关键字,我们用户自己定义的变量函数名等要注意不可以与关键字同名。
C语言中的32个关键字 | |||
---|---|---|---|
auto | double | int | struct |
break | else | long | switch |
case | enum | register | typedef |
char | extern | return | union |
const | float | short | unsigned |
continue | for | signed | void |
default | goto | sizeof | volatile |
do | if | static | while |
C语言中的基本输入输出
printf函数
格式控制字符串有两种:格式字符串和非格式字符串。非格式字符串在输出的时候原样打印;格式字符串是以%打头的字符串,在“%”后面跟不同格式字符,用来说明输出数据的类型、形式、长度、小数位数等。格式字符串的形式为:% [输出最小宽度] [.精度] [长度] 类型
常用的输出格式及含义如下:
格式字符 | |
---|---|
d , i | 以十进制形式输出有符号整数(正数不输出符号) |
O | 以八进制形式输出无符号整数(不输出前缀0) |
x | 以十六进制形式输出无符号整数(不输出前缀0x) |
U | 以十进制形式输出无符号整数 |
f | 以小数形式输出单、双精度类型实数 |
e | 以指数形式输出单、双精度实数 |
g | 以%f或%e中较短输出宽度的一种格式输出单、双精度实数 |
C | 输出单个字符 |
S | 输出字符串 |
scanf函数
scanf函数称为格式输入函数,即按照格式字符串的格式,从键盘上把数据输入到指定的变量之中。scanf函数的调用的一般形式为:
scanf("格式控制字符串",输入项地址列表);
scanf()函数所用的转换说明符与printf()所用的几乎完全相同。主要区别在于printf()把%f、%e、%E、%g、%G同时用于float类型和double类型,而scanf()只是把他们用于float类型,而用于double类型时要求使用l(字母l)修饰符。
转换说明符 | |
---|---|
%c | 把输入解释成一个字符 |
%d | 把输入解释成一个有符号十进制整数 |
%e,%f,%g,%a | 把输入解释成一个浮点数(%a是C99的标准) |
%E,%F,%G,%A | 把输入解释成一个浮点数(%A是C99的标准) |
%i | 把输入解释成一个有符号十进制整数 |
%o | 把输入解释成一个有符号的八进制整数 |
%p | 把输入解释成一个指针(一个地址) |
%s | 把输入解释成一个字符串:输入的内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符 |
%u | 把输入解释成一个无符号十进制整数 |
%x,%X | 把输入解释称一个有符号十六进制整数 |
*修饰符在scanf中()的用法:
*在scanf()中提供截然不同的服务,当把它放在%和说明符字母之间时,它使函数跳过相应的输入项目。请参考程序事例:
/*用*跳过scanf接收的数字*/
#include<stdio.h>
int main(void)
{
int num;
printf("Please enter three number:\n");
scanf("%*d %*d %d",&num);
printf("The last number is %d\n",num);
return 0;
}
scanf()的返回值:
scanf()函数返回成功读入的项目的个数。如果它没有读取任何项目(比如它期望接收一个数字而您却输入的一个非数字字符时就会发生这种情况),scanf()返回0。
当它检测到“文件末尾”(end of file)时,它返回EOF(EOF在是文件stdio.h中的定义好的一个特殊值,一般,#define指令将EOF的值定义为-1)。
字符输出函数putchar
putchar函数是字符输出函数,其功能是在终端(显示器)输出单个字符。其函数原型为:
int putchar(int ch);
ch表示要输出的字符内容,返回值作用为:如果输出成功返回一个字符的ASC码,失败则返回EOF即-1,如代码:
putchar(‘A’); /*输出大写字母A */
putchar(x); /*输出字符变量x的值*/
putchar(‘\n’); /*换行*/
字符输入函数getchar
getchar函数的功能是接收用户从键盘上输入的一个字符。其一般调用形式为:
getchar();
getchar会以返回值的形式返回接收到的字符。即该字符的ASC码,通常的用法如下:
char c; /*定义字符变量c*/
c=getchar(); /*将读取的字符赋值给字符变量c*/
字符串接收函数gets的用法
本节来讲解关于gets函数的用法,在C语言中,除了用scanf,以%s接收字符串之外,还可以使用gets函数更方便的接收字符串。
其函数原型如下:
char *gets(char *str);
在包含 include <stdio.h>头文件的情况下,可以用gets直接往字符数组里接收字符串,我们通过观察函数原型,可以看到在gets中传入一个字符指针,也就是存放这个字符串的字符数组地址即可接收,需要主要的是,要保证能存的下。
其运行过程为:当执行gets函数时,程序会等待用户从键盘输入的字符串,一旦遇到结束标志,即回车,那么之前输入在缓冲区中的字符串则会一起输入到gets中str所指向的内存区域里。此过程与scanf函数类似,最主要的不同在于,scanf接收时的结束标志有空格和回车,而gets不包括空格。也就意味着gets可以接收空格本身作为内容的一部分。这在实际解题、开发过程中时很有用的。大家可以自行尝试,需要注意的是gets不会检查输入的字符串长度,即可能超出字符串数组的长度造成内存溢出,这其实也是gets函数不安全的原因,其已经在不少OJ中不允许使用。
字符串输出函数puts的用法
C语言中的字符串输出函数除了printf还可以用puts来更方便的处理,puts函数原型如下:
int puts(const char *s);
在包含头文件# include <stdio.h>后,即可将想要输出的字符串或者字符数组的地址传入puts即可打印输出。
可以直接看例子程序:
#include <stdio.h>
int main(void)
{
char str[100] = "www.baidu.com";
printf("%s\n", str);
puts(str);
return 0;
}
我们将提前准备好的字符串,通过两种办法,分别用以前的printf用%s输出,以及用puts直接输出,输出如下:
www.baidu.com
www.baidu.com
可以看到puts比printf函数方便得多,不需要指定字符串类型,而且末尾不用加换行符会自动换行,对于单独字符串的使用,确实方便很多。