一、  概述

      数据是C语言程序操作的基本对象,在C语言中,按被定义变量的性质、表示形式、占据存储空间的多少、构造特点可把数据划分为基本数据类型构造数据类型、指针类型和空类型,如图所示:

    二、标识符

      在C语言中,所谓标识符,是指用来标识程序中用到的变量名、函数名、类型名、数组名、文件名及符号常量名等的有效字符序列。标识符的命名规则是:

  1. 组成:由字母、数字及下划线组成;
  2. 开头:不能以数字开头,第一个字符必须是字母或下划线;
  3. 不能是关键字。

    三、关键字

在c语言中,具有特别意义的字符串称为关键字,也称保留字。

     四、常量和变量

        C程序的数据中,按其值是否可改变分为常量和变量。在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。

        1.常量

        常量可分为直接常量符号常量两种。

  •                 直接常量又包括整型常量、实型(浮点型)常量和字符常量。
  •                 符号常量是用标识符来表示一个常量。符号常量在使用之前必须先定义,其一般形式为:
#define PI 3.1415926

        其含义是以标识符PI来代表数据3.1415926。宏定义命令之后,程序中用到的3.1415926的地方都可以用标识符PI来替代。

        宏定义可以增强程序的可维护性。例如,当需要修改某一常量时,只需要修改定义中的常量值即可。

        习惯上符号常量的标识符用大写字母表示。

        2.变量

        每个变量都有一个名字,这个名字称为变量名。变量名必须是合法的标识符,它代表了某个存储空间及其所存储的数据。这个空间所存储的数据称为该变量的值。

        (1)变量的定义

        变量在使用之前必须先定义,定义变量的一般格式为:

类型说明符 变量名;

        例如,定义一个整型变量a

int a;

        定义变量时,应注意下面4点:

  •    允许在一个类型说明符后定义多个相同类型的变量,各变量名之间用逗号隔开,具体格式为:
类型说明符 变量名1,变量名2,变量名3,......
  •      类型说明符与变量名之间至少有一个空格
  •      最后一个变量名之后必须以;结尾
  •     变量定义必须放在变量使用之前,一般放在函数体的开始部分。

                (2)变量的赋值

        在定义变量的时候,可以同时给变量赋初始值,这种形式也成为变量的初始化。例如,定义一个整型变量a,并为其赋值0

int a = 0;

        也可以先定义变量,再对变量赋值。

int a;
a = 0;

五、基本数据类型

        1.整型

        (1)整型常量

        整型常量的表示形式如下:

  • 十进制整数:如18,-175
  • 八进制整数:以0开头,用0~7这8个数字组合表达。例如:0154
  • 十六进制数:以0x或0X开头,用0~9这10个数字及字母A~F组合表达。例如:0x15F

【注意】   

  • 默认整型常量为int类型 

  • 在常量后面加上字符L(l)和U(u)进行修饰,L表示该常量为长整型,U表示该常量为无符号整型。例如:12567895468L、500U等。   

         (2)整型变量

        整型变量可分为有符号整型和无符号整型两大类。

        有符号整型指的是所存储的数值可以带正负号,所以需要一个符号位。

        无符号整型指的是数值只有整数。

【注意】默认情况下,C程序的整型表里是有符号的,若要使用无符号整型,需要用关键字unsigned声明。

     为了适应不同的应用场合,C程序中可以定义多种整数类型,其长度各不相同。其中,最常用的是有符号整型(用关键字int表示)长度为32位(4个字节)。此外,还有长整型(用关键字long表示)和短整型(用关键字short表示)。

      编写程序时,除可以指明变量是长整型或短整型,有符号整型或无符号整型,还可以把说明符组合起来。因此,整型变量可以分为有符号基本整型、无符号基本整型、有符号短整型、无符号短整型、有符号长整型和无符号长整型这6种。各类型的关键字和取值范围如表所示。

【数据溢出】

在c程序中,在C程序中,各种整型变量都有其特定的表示范围,当一个数据超出了其类型所能表示的范围时,称为数据溢出。

【案例3.1】

#include <stdio.h>
int main(){
    short a,b;
    a = 32757;
    b = a+1;
    printf("a=%d,b=%d",a,b);
    return 0;
}

       【运行结果】  程序运行结果如图所示。

【程序说明】 这里定义的变量a和b是有符号短整型,其取值范围为−32768~32767,所以当a的值加1变成了32768后就会发生“溢出”。但程序运行时并不报错,它好像汽车里程表一样,达到最大值以后,又从最小值开始计数。所以32767加1后得到的结果不是32768,而是−32768。       

        2.浮点型

        浮点型数据也称为实型数据,是带有小数点或指数符号的数值数据,包括浮点型常量和浮点型变量两类。       

(1)浮点型常量

浮点型常量的表示只采用十进制形式,包括直接十进制形式和指数形式两类。 (

1)直接十进制形式,如0.0013、−1482.5。

2)指数形式,通常用来表示一些比较大或者比较小的数值,格式为 实数部分+字母E或e+正负号+整数部分 其中字母E或e表示十次方,正负号表示指数部分的符号,整数部分为幂的大小。字母E或e之前必须有数字(实数部分),之后的数字必须为整数。例如,0.0013可表示为1.3e−3,−1482.5可表示为−1.4825e3。

(2)浮点型变量

    根据其精度不同,浮点型变量可以分为单精度类型、双精度类型和长双精度类型。

1)单精度类型使用关键字float来定义变量,它在内存中占4个字节,提供6位有效数字,取值范围为−3.4×1038~−1.2×10−38、0和1.2×10−38~3.4×1038。

【例3-1-2】  单精度型数据的有效位。

#include <stdio.h>
int main()
{
	float f;					/*定义单精度型变量f*/
	f=1234567.95789;			/*将值1234567.95789赋给变量f*/
	printf(“f=%f\n”,f);		                            /*输出变量f的值*/
	return 0;					/*函数返回值0*/
} 

      【运行结果】  程序运行结果如图所示。

 

  2)双精度类型使用关键字double来定义变量,它在内存中占8个字节,提供15位有效数字,取值范围为−1.7×10308~−2.3×10−308、0和2.3×10−308~1.7×10308。

【例3-1-3】  将例3-1-2中的变量定义为double类型。

#include <stdio.h>
int main()
{
	double f;					/*定义双精度型变量f*/
	f=1234567.95789;			/*将值1234567.95789赋给变量f*/
	printf("f=%f\n",f);		/*输出变量f的值*/
	return 0;					/*函数返回值0*/
}

 3)长双精度类型使用的关键字是long double。不同的编译系统对long double型的处理方法不同。例如,Turbo C 2.0对long double型分配16个字节,而Visual C++则对long double型和double型一样处理,其有效数字位数和取值范围也与double型一致。 

         3.字符型

        字符型数据包括字符型常量和字符型变量。

1)字符型常量 字符型常量包括字符常量、字符串常量和转义字符。

  • C程序中的字符常量必须用单撇号(单引号)括起来,且单撇号中只能是单个字符,如'A'、'a'、'8'、'&'。

  • 由于字符型数据在C程序中是以ASCII码形式存储的,因此字符常量的值就是其对应的ASCII码值。例如,字符'A'的ASCII码值为65,'a'的ASCII码值为97。

2)字符串常量是一对双撇号(双引号)括起来的一个或多个字符。例如,"A"、"China"、"Welcome to beijing"等。 C程序中存储字符串常量时,系统会在字符串的末尾自动加一个'\0'作为字符串的结束标志。例如,字符串常量"China"在内存中的存储形式如图所示。

3)转义字符是C程序中表示字符的一种特殊形式,它以反斜杠“\”作为标志符号,后面跟一个字符(也可以是一个八进制或十六进制数)。转义字符具有特定的含义,不同于字符原有的意义,如转义字符'\0'表示字符串结束。常用转义字符如表所示。

字符型变量用来存储单个字符,类型说明符是char。字符型变量定义的格式和书写规则都与整型变量相同。例如:

char c1,c2;			/*定义字符型变量c1和c2*/
c1='a';			/*将’a’赋值给c1*/
c2='b';			/*将’b’赋值给c2*/

        4. 数据类型转换

        在C程序中,不同类型的数据可以混合运算,但在运算之前应先转换成同一类型。数据类型的转换有自动类型转换和强制类型转换两种方式。

        1)自动类型转换

        自动类型转换是由编译系统自动进行的,不需要人为干预。自动类型转换要遵循以下3个基本规则。

  • 若参与运算的变量类型不同,须先转换成同一类型(自动转换),然后进行运算。
  • “低级向高级转换”原则。如果运算中有几种不同类型的操作数,则统一转换为最高级的数据类型后再进行运算。数据类型的转换方向如图所示。

  • 赋值运算两边的数据类型不同时,赋值号右边数据的类型将会转换为左边数据的类型。其中,浮点型值赋值给整型变量的时候,会把小数点后面的值去掉,只保留整数部分的值。

【例3-1-4】  数据类型转换的应用。

#include <stdio.h> 
int main() 
{
	int a,x;						/*定义整型变量a和x*/
	float b;						/*定义单精度型变量b*/
	double c,y;					/*定义双精度型变量c和y*/
	a=1; 							/*将1赋值给a*/
	b=2.1;							/*将2.1赋值给b*/
	c=3.2;							/*将3.2赋值给c*/
	x=a+b+c;						/*将a、b、c的和赋值给x*/
y=a+b+c;						/*将a、b、c的和赋值给y*/
	printf("x=%d,y=%f",x,y);	/*输出整型变量x和单精度型变量y*/
	return 0;
}

【运行结果】  程序运行结果如图所示。

【程序说明】  计算a+b+c时,先将变量a和变量b都转换成double型,然后计算,所以结果为double型。但赋值时,x为int型,故会将计算结果转换成int型赋值给x,x的值为6。

        2)强制类型转换

        强制类型转换也称显示类型转换,作用是将表达式的结果强制转换成类型标识符所指定的数据类型,运算格式为

(类型标识符)(表达式)

        类型标识符和表达式都应用圆括号括起来(单个操作数时,表达式的圆括号可以省略)。例如:

(double)a                /*将a转换成double类型*/

(int)(a+b)            /*将a+b的值转换成整型*/

(int)a+b                /*将a转换成整型,然后与b相加*/

【注意】

        强制类型转换只作用于表达式的结果,并不改变各个变量本身的数据类型。

六、运算符

        1.算术运算符和算术表达式

            算术运算符用于各类数值运算。在C程序中,基本算术运算符有5种,即+、−、*、/、%(模运算);正负号运算符有2种,即+(正号)和−(负号);自增、自减运算符有2种,即++(自加)和−−(自减)。带有算术运算符的表达式称为算术表达式。 基本算术运算符是双目运算符,即要求有两个运算量,如x+y、x−y、x*y、x/y、x%y等,其优先级和数学中一样。

        自增和自减运算符是在程序设计中使用频率较高的两个运算符,它们的作用是将操作数的值增1(或减1)后,重新写回该操作数所在的存储单元。

         自增和自减运算符有前置和后置两种使用形式。当某一运算只包含自增或自减操作时,自增或自减运算符的前置和后置形式的作用相同。例如,如果变量i的值为3,则执行i++与++i的结果相同,运算后i的值均为4。

        但是,当自增、自减运算的结果被作为操作数参与其他操作时,前置与后置的情况就有所区别了。例如,设运算前i=3,则以下4个表达式的运算结果如表所示。

        

        2.赋值运算符和赋值表达式

        C程序中,赋值也是一种运算,运算符为“=”,它的作用是将一个表达式的值赋给一个变量,如x=4。需要注意的是,赋值运算符的左边必须是一个变量。 赋值运算符的优先级低于算术运算符,结合方向是从右向左。例如,表达式x=3*4等价于x=(3*4),表达式x=y=z等价于x=(y=z)。

        大多数双目运算符都可以和赋值运算符“=”结合起来,构成一个复合的赋值运算符,如+=、−=、*=、/=、%=等。例如:

x+=10;			/*等价于x=x+10;*/
y−=10;			/*等价于y=y−10;*/
z*=10;			/*等价于z=z*10;*/
m/=10;			/*等价于m=m/10;*/
n%=10;			/*等价于n=n%10;*/

【例3-1-5】  赋值运算符的应用。

#include <stdio.h>
int main()
{
	int a=1,b=2,c=3,d=4;		       /*变量初始化*/
	a+=a;									/*a=a+a*/
	b-=c; 				       /*b=b-c*/
	c*=d;									/*c=c*d*/
	d/=a;									/*d=d/a*/
	printf(“%d,%d,%d,%d\n”,a,b,c,d);	     /*输出变量的值*/
	return 0;
}

【运行结果】  程序运行结果如图所示。

        3.位运算符和位表达式

        位运算是指进行二进制位的运算,如将一个存储单元中的各二进制位左移或右移一位。位运算符包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)和右移(>>)6个,其中取反运算是单目运算,其余是双目运算,参与位运算的数据类型只能是整型或字符型。位运算符的功能如表所示。

运算符

功能描述

&

按位与运算符,对操作数中相应的位进行与运算。如果相应的位都是1,结果位就是1,否则就是0

|

按位或运算符,对操作数中相应的位进行或运算。如果两个对应的位中有一个是1,结果位就是1;如果两个位都是0,结果就是0

^

按位异或运算符,对操作数中相应的位进行异或运算。如果相应的位不相同,结果位就是1;如果相应的位相同,结果位就是0

按位取反运算符,用来对操作数中的位取反,即1变成00变成1,是一个单目运算符

>><<

移位运算符,用来将一个数的各二进制位全部右移或左移若干位

        左移运算符(<<)。左移运算用来将一个数的二进制位全部左移若干位,高位左移溢出后舍弃,右端低位补0。例如,a=a<<2,表示将a的二进制数左移2位,右端补0。若a=3,即二进制数00000011,左移2位得000001100,结果为十进制数12。

         右移运算符(>>)。右移运算用来将一个数的二进制位全部右移若干位,低位右移舍弃,对无符号数,高位补0。例如,若a为无符号数,执行a=a>>2,表示将a的二进制数右移2位,左端补0。若a=3,即二进制数00000011,右移2位得00000000,结果为十进制数0。

         对于有符号数,在右移时,符号位将一同移动,当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0或是补1取决于编译系统,Visual C++规定为补1。

  [例3-1-6】  位运算符的应用。

#include <stdio.h>
int main()
{
	int a=10,b=5;				/*变量初始化*/
	int c,d,e,f,g,h;
	c=a&b;						/*按位与的值赋给c*/
	d=a|b;						/*按位或的值赋给d*/
	e= a^b; 					/*按位异或的值赋给e*/
	f=~a;						/*a按位取反后的值赋给f*/			
	g=a<<1;					/*a左移1位后的值赋给g*/			
	h=a>>1; 					/*a右移1位后的值赋给h*/				
	printf("%d,%d,%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f,g,h);
	return 0;
}

【运行结果】  程序运行结果如图所示。

【程序说明】  这里定义的变量是有符号基本整型,a的二进制表示为00001010,b的二进制表示为00000101,位运算过程如表所示。

a左移1位得00010100,结果为十进制数20,即g=20;a右移1位得00000101,结果为十进制数5,即h=5。 位运算符与赋值运算符也可以组成复合赋值运算符,包括&=、|=、>>=、<<=、^=。例如,a&=b相当于a=a&b,a<<=4相当于a=a<<4。

【案例分析】

本任务中涉及的变量包括三角形的边长和面积,边长的数据类型通常为浮点型,为了更精确地显示计算结果,面积的数据类型可定义为双精度型。由于计算面积时需要用到平方根的计算,须调用math.h头文件。

#include <stdio.h>
#include <math.h>
int main()
{
	float a,b,c;				/*定义三角形的3条边*/
	float s;					/*定义中间变量s*/
	double area;				/*定义面积area*/
	printf("请输入三角形3条边的长度");
	scanf(“%f%f%f”,&a,&b,&c);		              /*从键盘中输入3条边的值*/
	s=(a+b+c)/2;				/*求解中间变量s*/
	area=sqrt(s*(s-a)*(s-b)*(s-c));	               /*利用公式求解三角形的面积area*/
	printf(“三角形的面积为 %f\n”,area);	               /*输出面积area*/
	return 0;
}

七、格式输入输出函数

C语言本身没有提供输入输出语句,输入和输出操作由C函数库中的函数来实现。在使用系统库函数时,要使用预编译命令“#include”,将有关的“头文件”包含进来。

1.格式输出函数printf()

其功能为将指定内容显示在屏幕。

格式:printf("格式控制",输出项列表);

(1)格式控制是用“”括起来的一个字符串,称为“转换控制字符串”。它包括格式声明和普通字符两部分:

  • 格式声明:

  • 其中方括号中的项为可选项。

    标志:标志字符有“+”和“−”两种,用来指定输出数据的对齐方式。指定“+”时,输出右对齐;指定“−”时,输出左对齐;不指定标志,默认右对齐。

    输出最小宽度:用十进制整数来表示输出的最少位数m。若实际位数多于定义的宽度,则按实际位数输出;若实际位数少于定义的宽度,则补空格或0(如果在m前有数字0,则补0)。

    精度:精度格式符以“.”开头,后跟十进制整数n。如果输出的是数字,精度表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。

    长度:长度格式符有h和l两种,h表示按短整型输出,l表示按长整型输出。

    格式字符 功能
    d 以十进制形式输出带符号整数(正数不输出符号)
    o 以八进制形式输出无符号整数(不输出前缀0)
    x/X 以十六进制形式输出无符号整数(不输出前缀0x)。x表示以小写字母输出十六进制数的a-f;X表示以大写字母输出十六进制的A~F
    u 以十进制形式输出无符号整数
    f 以小数形式输出单、双精度实数,默认输出6位小数
    e/E 以指数形式输出单、双精度实数。用e,指数以e表示;用E,指数以E表示。
    c 输出单个字符
    s 输出字符串
    *

    #include <stdio.h>
    int main(){
        unsigned int a = 15;
        double b = 123.456;
        printf("a=%d\n",a);
        printf("a=%o\n",a);//17---8进制
        printf("a=%x\n",a);//f---16进制
        printf("a=%X\n",a);//f---16进制
        printf("a=%u\n",a);
        printf("b=%f\n",b);
        printf("b=%e\n",b);//1.23*10的2次方
        printf("%c\n",97);//a
        printf("%s","hello");
        
        return 0;
    }
    #include <stdio.h>
    int main(){
        int a = 12345;
        double b = 123.4567;
        printf("%-10d\n",a);//左对齐,剩余不足的位数用空格补全
        printf("%10d\n",a);//     123456,右对齐,剩余不足的位数用空格补全
        printf("%010d\n",a);//00000123456  右对齐,剩余不足的位数用0补全
        
        printf("%.3f",b);
        return 0;

    }

  • 普通字符:指需要原样输出的字符。

    (2)输出项列表:可以是多个变量、常量或表达式,多个之间用逗号即可。要求格式声明和各输出项在数量和类型上一一对应。

2.格式输入函数scanf()

作用是将数据按规定的格式从键盘读入到指定变量中,格式为:

scanf("格式控制字符串",输入项地址列表);

(1)格式控制字符串

包含格式声明和普通字符两部分。格式声明用于规定输入数据的格式,如数据的类型、长度等;普通字符是按须原样输入的字符。

格式声明的格式如下

%[m][l或h]格式字符

①长度l或h:l表示长整型或双精度数据;h表示输入短整型数据

②数据宽度m:m为十进制整数,用于指定输入数据的宽度

例如:

scanf("%4d",&a);
如果输入123456,则只读入1234,后面的5,6被舍弃。如果输入小于4位,则不影响。

对指定了宽度的格式输入,数据之间可以无分隔符,将按照各自宽度来读入,例如:

scanf("%3d%3d",&a,&b);
输入123456
则a=123,b=456

对于浮点型数据,数据宽度为数据的整体宽度,包括小数点在内,即数据宽度m=整数位数+1(小数点)+小数位数。

格式输入函数只能指定数据整体宽度,无法指定小数位数,这与格式输出函数printf()不同。

例如:

scanf("%3f%3f",&a,&b);
输入1.23.4,则a等于1.200000,b等于3.400000;
输入1234.5,则a等于123.000000,b等于4.500000;
输入1.234.5,则a等于1.200000,b等于34.0000000。

(2)输入项地址列表:

由需要输入变量的地址组成的列表。变量的地址用取地址运算符&得到。多个输入项之间用逗号隔开,要求格式声明在数量和类型上与各输入项一一对应。

  1. 用Scanf函数一次输入多个数值或多个字符串时,在两个数据之间可用一个或多个空格、换行符(Enter键)或Tab符作为分隔。

  2. 当输入的数据类型与scanf函数中的格式符指定的类型不一致时,系统认为该匹配数据结束

    #include <stdio.h>
    int main(){
        int i;
        char j;
        float k;
        printf("请输入一个整数、一个字符、一个小数\n");
        scanf("%d%c%f",&i,&j,&k);
        printf("%d%c%f",i,j,k);
        return 0;
    }

  1. 当scanf函数输入字符时,系统将输入的空格、换行符作为有效字符

#include <stdio.h>
int main(){
    char i,j,k;
    printf("请输入三个字符\n");
    scanf("%c%c%c",&i,&j,&k);
    printf("%c%c%c",i,j,k);
    return 0;
}

【案例一】用户输入两个整数,计算这两个整数的和,然后输出和

#include <stdio.h>
int main(){
    /*
    用户输入两个整数数字,将这两个数字的和输出到控制台
    分析:
    1.定义两个整型int变量用于保存用户输入的数字;定义一个保存和的变量
    2.用scanf将用户输入的数字读取到对应的变量中
    3让这两个数字做+运算,将和放到和变量中
    4.将和输出到控制台
    */
    int a,b,sum;
    printf("请输入两个整数:");
    scanf("%d%d",&a,&b);
    sum = a+b;
    printf("sum=%d",sum);
    return 0;
}

【案例二】从键盘输入一个大写字母,输出该大写字母对应的小写字母

分析: 1.定义一个字符变量用于存储用户输入的字母 2.scanf将用户输入的字母读入 3.将读入的字符+32转成对应的小写字母 4.将转换后的小写字母以字符形式输出

    char ch;
    scanf("%c",&ch);
    printf("%c",ch+32);

【案例三】用户输入圆的半径,计算出圆的周长和面积,并输出周长和面积

分析: 1.定义一个float类型变量存储用户输入的半径 2.用scanf函数将用户输入的半径读入 3.计算出圆的周长和面积 4.输出周长和面积

double radius, circumference, area;
// 输入半径
printf("请输入圆的半径:");
scanf("%lf", &radius);
// 计算周长和面积
circumference = (2 * 3.14) *radius;
area = 3.14 *radius*radius;
​
// 输出结果(保留两位小数)
printf("周长:%.2f\n", circumference);
printf("面积:%.2f\n", area);

五、字符输入输出函数

1.字符输出函数putchar()

该函数的功能为向显示器输出一个字符

putchar('H');//输出字符H
putchar('\n');//换行
char c = 'X';
putchar(c)//输出字符变量c;

2.字符输入函数getchar()

该函数的功能是读取从键盘输入的一个字符

char c = getchar();
putchar(c);

(1)getchar函数只能接收一个字符,输入数字也按字符处理

(2)输入多个字符时,计算机只接收第一个字符

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐