C语言(三):C语言基础【顺序程序设计】

本文介绍了C语言中的常量(如整型、实型、字符型和符号常量)和变量的概念,强调了它们的差异。接着,概述了数据类型,包括基本类型、空类型、枚举和派生类型。此外,还讨论了运算符和表达式的优先级、混合运算及类型转换。C语句的分类和赋值语句的细节也被提及,最后简要阐述了数据的输入输出操作,如printf和scanf函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、常量和变量

1.常量:程序运行中,其值不能被改变的量。

2.变量:一个有名字的,有特定属性的,一个存储单元

3.常变量:常变量是有名字的不变量

4.标识符:用来对变量,符号常量名,函数,数组类型等命名的有效字符序列

二、数据类型

1.基本类型

2.空类型(void)

3.枚举类型(enum)

4.派生类型

三、运算符和表达式

 1.运算符

 2.优先级

 3.不同类型间的混合运算

 4.强制类型转换运算符

四、C语句

1.C语句分为五类

 2.归纳一下,赋值相关的问题

五、数据的输入输出

1.输入输出注意事项

2.有关输入输出的概念

3.用 printf 函数输出数据

4.用 scanf 函数输入数据 

5.字符输入输出函数


一、常量和变量

1.常量:程序运行中,其值不能被改变的量。

                (1)整型常量 (123,-12)

                (2)实型常量(1.十进制小数形式【123.2】; 2.指数形式【12.34e3】)

                (3)字符常量(1.普通字符【用单引号,括起来的字符,只能是 ‘a’,不能是 ‘ab’】;

                                           2.转义字符【以"\",开头的字符序列】)

                (4)字符串常量(“abc”)

                (5)符号常量(#define PI 3.14  ,注意末尾没有分号)

【注意】

1、e或E之前必须有数字,且e或E之后必须是整数(不能写e4,12e2.5)。

2、单引号只是界限符,字符常量只能是一个字符,不包括单引号。

3、'a' 和 'A'是不同的字符常量,字符常量存储时,不是存储字符,而是存它对应的ASCII码。

4.要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存,只是一个临时符号,代表一个值,在预编译后就不存在了,所以不能对其重新赋值。为了与变量名区别,符号常量一般大写表示(PI,PRINCE)

 2.变量:一个有名字的,有特定属性的,一个存储单元

        用来存放值,程序运行期间,变量的值可以改变。

【注意】变量必须先定义,后使用,注意区分变量名和变量值。

3.常变量:常变量是有名字的不变量

定义方式:在变量前,加上 const

4.标识符:用来对变量,符号常量名,函数,数组类型等命名的有效字符序列

C语言规定,标识符只能由字母、数字、下划线组成,且第一个字符必须为字母或下划线。

【注意】编译系统认为,大小写的字母是不同的字符。

二、数据类型

1.基本类型

(1)整数类型

(2)浮点类型

2.空类型(void)

3.枚举类型(enum)

4.派生类型

        (1)指针类型(*)

        (2)数组类型( [ ] )

        (3)结构体类型( struct )

        (4)共用体类型( union )

        (5)函数类型

【注意】

        1.int(shortint),字符 型:用整数的补码形式存放到存储单元,存放整数的存储单元当中,最左边的一位是符号位(0是正,1是负)

        2.只有整形数据(包含字符型)数据可以加signed和unsigned修饰符,实形数据不能加。

        3.字符类型也属于整形,因为会被替换成ASCII码表示。

        4.在使用有符号字符型变量时,允许存储的值为-128~127,但是字符的代码不可能为负数,所以在存储字符时的实际上只用到0~127这一部分,其第一位都是0。

        5.系统在存放浮点型数据时,将实型数据分为小数部分和指数部分分别存储,小数部分小数点前面的数为0。

         6.凡是以小数形式或指数形式出现的实数均是浮点型常量,在内存当中以指数形式存储,C编译系统把浮点型常量都按双精度处理。

        7.   f/F:表示float类型 ;l/L:表示long double类型。

三、运算符和表达式

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 杂项运算符

 1.运算符

++i:i值先加一,再运算               i--:i值先运算,再减一

 

 2.优先级

 3.不同类型间的混合运算

        1. int 与 float/double ,int -> float/double,结果为double。

        2.float 与 double,float -> double,结果为double。

        3.字符型和整型,字符型 -> ASCII ,结果为int。

        4.字符型和浮点型,字符型 -> ASCII -> double,结果为double。

4.强制类型转换运算符

形如:(转换类型)(表达式)

例子:(double)a;(int)(x+y);

【注意】:在强制类型转换时,所得到的只是一个所需的中间数据(临时的数据,使用之后就不存在了),而原本的变量的类型没有发生变化。例如 a =(int)x;x是float类型,那么得到一个int类型的临时值,赋给a,x依然是float类型。

四、C语句

        由前面看到,函数包含一个声明部分执行部分,执行部分是由语句组成,语句的作用是向计算机系统发出操作指令,要求执行相应的操作。一个C语句经过编译后产生若干条机器指令。声明部分只是对有关部分的声明,它不产生机器指令。 

    C程序结构如下图

 

1.C语句分为五类

        1.控制语句(9个)

  • if() ... else ...        (可写成:if(x>y)z=x;else z=y;)
  • for() ...
  • while() ...
  • do ...while() ...   
  • continue
  • break
  • switch
  • return
  • goto       (转向语句,在结构化程序当中基本不用)

        2.函数调用语句

        由一个函数调用加一个分号构成,例如:printf(" This is C statement. ");

        3.表达式语句

        由一个表达式加一个分号构成,例如:a=3 是一个赋值表达式,而 a=3;才是一个赋值语句。

        4.空语句

例如:

此语句就一个分号,那么他的作用是什么呢?

可作为流程的转向点(流程从程序的其他地方转到此处),也可以做循环体(表示循环体啥也不用做)。

        5.复合语句

可以用 { } 把一些语句和声明括起来成为复合语句(又称语句块),例如:

{
    int a = 1;
    b = a;
    printf("b=%d",b);
}

        6.最基本的语句——赋值语句

        在C程序当中,最常用的就是赋值语句输入输出语句,可以自己试一试写出求三角形的面积。

【注意】:凡是在程序当中要用到数学库中的函数,都要在本文件开头包含 math.h 头文件。

 

 2.归纳一下,赋值相关的问题

1.赋值运算符

        “ = ”就是赋值运算符,例如:a = 3;就是把常量3赋值给变量a;同理表达式的值也可以赋给变量。

2.复合的赋值运算符

        在“ = ”之前加上其他的运算符,例如“ += ”,如:a += 3 等价于 a = a +3;

      【注意】:如果运算符右边部分是一个表达式,那么默认他是一个带括号的整体,在处理不同优先级的时候,需要特别注意!!!

3.赋值表达式

        将一个变量和表达式连接起来的式子,称为”赋值表达式“ 。如:变量  赋值运算符  表达式

例如:a = 3 * 5;c这个赋值表达式,顾名思义包含两种作用,一,计算表达式的值;二,把值赋给变量

        赋值运算符左侧的值,应该是一个可以修改的值,称为”左值( left value , 简写 lvalue )”,很显然并不是任何值都可以出现在左边,左值应当为存储空间并可以被赋值,变量可以是左值,而表达式就不行,常量也不行。同理,右值就是赋值运算符右边的值,凡是左值,都可以出现在右值的位置。例如:a = (b=2);

4.赋值过程当中的类型转换) 

        两边类型一致,就直接赋值,不一致,就需要按照系统规则进行类型转化。转换规则是:

(1)浮点类型(d/f)赋给整型变量时,先对浮点数取整,然后赋给整型变量,如 “i = 3.14;”执行后就是使 i 的值为3,以整数形式存储到变量当中。

(2)整型赋给浮点类型(d/f),数值不变,但是以浮点数形式存储到变量,如有 float 类型的 f 变量,执行“f = 22;”,那么 f的值就是 22.0 。

(3)将 double 类型赋值给 float 类型时,先将双精度转为单精度,即智取6~7为有效数字,存储到 float 类型的 4 字节变量当中。反之,把 float 类型赋值给 double 类型时,数值不变,在内存当中以 8 字节存储,有效位拓展到了 15 位。

【注意】双精度的大小不能超过 float 类型变量的数值范围,如:“double d = 3.14e100;f = d;”出现了指数的100次方,float无法容纳这么大的数,会出现错误。

(4)字符型赋值给整型时,就是 ASCII 码赋给整型变量。 如:“int i = 'A';”, i 的值为65。

(5)将占字节多的整型数据赋给占字节少的整型数据或字符变量时,如:把 4 字节的 int ,赋值给 2 字节的 short 或 1字节的 char ,只将其低字节原封不动的送到被赋值的变量(发生 “截断 ”)

如下图举例所示

 总结:

        看起来很多很复杂的规则,其实就两个要点,(1)整型之间的赋值,按照存储单元当中的存储形式对应起来直接传送即可    (2)实型数据之间 以及 整型与实型 之间的赋值,都是先转换类型,后赋值。

5.赋值表达式和赋值语句区别

        赋值表达式的末尾没有分号,赋值语句末尾必须有分号。在一个表达式当中可以包含一个或多个赋值表达式,但是绝不能包含赋值语句。如:if((a = b > 0))max = a;是对的,但是如:if((a = b;)> 0 )max = a;这样是错的!其中 a = b;就是赋值语句。

         

6.变量赋予初值

        由之前语句可以看出,可以用赋值语句对变量赋值,也可定义变量时,对他赋予初值。

        一般变量初始化不是在编译阶段完成的(只有静态存储变量和外部变量的初始化是在编译时完成的),而是在程序运行时执行本函数时赋予初值的。

【特别注意!】“int a,b,c = 5” ,此语句声明了三个整型变量a,b,c;但是只对 c 赋值 5 。

对几个变量同时赋值应该写成:“ int a = 3,int b = 3,int c = 3;”,不能写成“int a = b = c = 3 ”。

五、数据的输入输出

1.输入输出注意事项

        (1)用 scanf 函数输入 a 的值,请注意在 scanf 括号内的变量 a 前面,加上地址符 & ,&a 表示变量 a 在内存当中的地址。

        (2)在 scanf 函数当中,把格式声明为“ %lf %lf %lf”,连续的三个 %lf 。要求输入三个双精度实数,输入的数据每两个之间用空格分隔。(系统会先把输入的三个数转换为双精度类型,然后赋值给变量)。

        (3)在 printf 函数当中,在格式符前面加上“ 7.2 ”,如printf(“ x = %7.2f ”,x),就表示输出时指定数据占7列,小数占2列。这样做的好处是:1.根据实际的需要来输出小数;2.输出时按照小数点对齐,使得数据呈现美观。

2.有关输入输出的概念

        在讨论程序的输入输出时要注意以下几点:

        (1)输入输出是以计算机主机为主体而言。

        (2)C语言本身不提供输入输出语句(由C标准函数库当中的函数实现)。

        (3)要在程序文件的开头,用预处理指令 #include ,把有关的头文件放在本程序中(就是包含stdio.h)。

【注意】#include 还有一种形式,就是不用尖括号,使用双撇号,如 #include " stdio.h "。这两种形式的区别是:

        < stdio.h >:编译系统从存放C编译系统的子目录去寻找需要包含的文件,称为标准方式

        " stdio.h " :系统在编译时,编译系统先在用户的当前目录(一般是用户存放源程序文件的子目录)中寻找要包含的文件,若找不到,再按照标准方式进行查找。

 

 3.用 printf 函数输出数据

       1. 一般格式为:printf(格式控制,输出列表);如下图所示

 格式声明总是由 % 开始,由 % 和 格式字符 组成(%d,%f)。

         2. 格式字符

  • d        用来输出一个有符号的十进制整数。如:%5d( 5 代表域宽,即所占列数为 5 )。
  • c        用来输出一个字符。只有 1 字节大小,超出部分也只取 1 字节长度。
  • s        用来输出一个字符串
  • f         用来输出实数(单/双精度、长双精度)。以小数形式输出。%f:整数部分全输出,小数只包含 6 位数。%7.2f:指定整数 7 位,小数 2 位,小数超出部分四舍五入。%- m.nf:添加了负号,也和没加相同,只是数据长度不超过 m 时,数据向左靠齐,有段补上0。
  • i         和 d 的功能一样,习惯用 d 。
  • o        以 8 进制整数输出。不带符号,符号位也一起作为 8进制输出。
  • x/X        以 16 进制整数输出。
  • u        输出十进制无符号整型数据。
  • g/G        输出浮点数,系统自动从 f / d / e 格式选择输出,其中会自己选择长度较短的格式。
  • e/E        用格式声明“ %e ” 指定以 指数形式 输出实数。不指定域宽的话,许多编译系统会给出数字部分的小数为 6 位,指数为 5 列(如:e+002,共占5列。)数值按标准化输出,即小数点前面只有一位非 0 数字。同样的也可以使用 %m.n 来指定域宽。(例如:printf(“%e”,123.456);输出1.234560e+002)。

还有一些附加函数如图

说明:

        (1)printf 函数输出时,对象的类型 和 格式 必须匹配,否则报错。

        (2)除了X、G、E 外。其它的只能小写。

        (3)如果想输出 % 字符,示例:printf("%f%%\n",1.0/3);输出0.333333%。

 

4.用 scanf 函数输入数据 

        一般形式:scanf(格式控制,地址列表);例如scanf(“a = %d”,&a);

注意事项:

        (1)格式控制后面的地址列表,注意一定不能忘了 & 。

        (2)格式控制当中除了格式声明还有其他字符也需要在输入时写入,以上述例子,那么应该输入a = 1;直接写 1 时是不对的。

        (3)如果格式控制当中有多个以逗号分割,那么输入也要以逗号分隔

        (4)如果格式控制当中多个格式无间隔,那么输入的时候也不能有符合,也不能要空格。

        (5)在输入数值数据时,如遇到非法字符(不属于数值),则认为程序结束。例如:scanf("%d%c%f",&a,&b,&c);如果输入1234a123o.26,那么a=1234;b=a;c=123。

 5.字符输入输出函数

        除了 printf 和 scanf 函数外,C库函数还提供了一些专门用于输入输出字符的函数。

(1)putchar输出函数。一般形式为putchar(a) ,如果a = 'Q',那么结果就是 Q。如果 a 是数字,那么就是输出对应的ASCII字符,但是注意整型数据的范围是0~127。

(2)getchar输入函数。它没有参数,一次只能接受一个字符

说明:在输入多个字符的时候,并不是输入了就送到计算机当中去了,而是存在键盘的缓冲器当中,等按下Enter之后一起送进去。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值