您好,欢迎访问本站博客!登录后台查看权限
  • 转载文章需要注意是否有转载标识,未经允许谢绝转载
  • 发贴请联系站长提权

C语言入门教程(六)-变量与数据类型、运算符

C语言 adminXiongmao 2019-04-01 174 次浏览 0个评论
网站分享代码

images.png

    经过上一章的学习,我们大体知道了如何用printf将内容输出到屏幕了,下面我们来思考下面这个问题

小红的年龄是15岁,她的身高是年龄的10倍,她的体重是年龄的5倍,她每天坐公交车的编号是她年龄的两倍,她的家人数量是她年龄的三分之一
要求:根据上面的题目给出的计算方式,让电脑计算出结果并输出到屏幕上。

根据我们上一章讲的,我们只能像下面这样写

#include<stdio.h>

int main(){

    printf("小红的信息:年龄:%d,身高:%d,体重:%d,公交车编号:%d,家人数量:%d",15,15*10,15*5,15*2,15/3);
    
    return 0;
}

可以发现,这个代码中会出现多个15,很繁复,而且如果我们需要更改小红的年龄,那就需要更改5次,大大增加了我们的工作量,那我们是否可以解决这个问题呢?当然可以的,这就需要使用到变量了

#include<stdio.h>

int main(){
    int y=15;//小红的年龄
    
    printf("小红的信息:年龄:%d,身高:%d,体重:%d,公交车编号:%d,家人数量:%d",y,y*10,y*5,y*2,y/3);
    
    return 0;
}

这里面的int y=15;就代表定义了一个整数形的变量,y就是它的变量名,变量名是我们自己取的,我们使用y就相当于使用15。那么我们是否可以连算式都在变量里储存,让代码更加易懂一点呢?当然是可以的。

#include<stdio.h>

int main(){
    int year=15;       //小红的年龄
    int height=y*10;     //小红的身高
    int weight=y*5;     //小红的体重
    int bus=y*2;       //公交车编号
    int family=y/3;     //家人数量
    
    printf("小红的信息:年龄:%d,身高:%d,体重:%d,公交车编号:%d,家人数量:%d",year,height,weight,bus,family);
    
    return 0;
}

可以看到,这样就可以一幕了然的知道后面各个值代表什么意思,而且更改起来也很方便。大体了解了一下变量之后呢,下面我们开始正式来学习一下变量。



-变量的语法-


变量顾名思义,就是可变的量可以将变量当成一个存储数据的盒子,我们可以向这个盒子里装相应类型的数据

首先来看一下变量的语法


定义一个变量

数据类型 变量名;

例:

int abc;

定义一个变量,相当于先准备一个盒子,这个盒子的名字就是变量名,前面的数据类型就代表我们这个盒子可以装什么样的数据,由于我们还没有给它赋值,所以这时这个变量里还没有装任何数据。要注意我们的变量名尽量语义化,比如说我这个变量存储的是一个图型的高,就可以命名为height(当然建议和其他单词组合使用,以免重复定义变量名),这样别人一眼就能看出来大概,我下面使用a或者abc等为变量命名是因为是示例代码,没什么实际含义,日常开发请语义化命名。(建议使用驼峰命名,也就是说如果是两个单词组成的变量名,第二个单词首字母大写,例如: familyNum。变量名可以使用缩写)

例子的代码就相当于定义一个变量abc,这个变量的类型为整数型(int)。


定义一个变量并赋值

数据类型 变量名=值;

例:

int abc=5;

这就相当于先准备一个盒子,在准备的过程中直接将东西放了进去放入的数据的类型必须与变量的类型一致

例子的代码就相当于定义一个变量abc,并为其赋值5;


定义一个变量,在需要的时候赋值

数据类型 变量名;
变量名=值;

例:

int abc;
abc=5;

因为我们定义一个变量,肯定是用来装东西的,有的时候在定义的时候我们不知道它会需要装什么东西,所以我们可以在之后对其赋值。


需要注意的是,变量名具有唯一性,只要之前有定义过的变量名,之后就不能再定义一次了,但是使用这个变量或为其赋值是可以有无限次的。

例:

int abc;
int abc;
abc=5;

上面这个就是错误的,在第一行已经定义了abc,我们就不能在第二行再去定义它了,这么做是没有意义的


int abc;
abc=5;
abc=7;
abc=8

但是这样是可以的,我们可以无数次的去使用或赋值变量。

int abc=3;
abc=5;
abc=7;
abc=8
printf("%d",abc);    //8

同样,初始化过的变量也是可以被赋值的,每一次赋值就会覆盖上一次的赋值




 -变量与数据类型-


上面讲了,变量是有数据类型的,那都有哪些呢?我们要怎样去定义不同类型的变量呢?下面我们来讲解一下一些常用的数据类型。


  1. 整数型(int)

    整数型我们在上面见过,关键字为:int它可以储存有符号整数及无符号整数,数据范围我在这里就不讲了,大家会乱的,也记不住,好奇的话可以上网查一下。

    整数型变量定义例子(include<stdio.h>和int main之类的固定格式我这里就不写了,大家下去写的时候要记得加上;//后面是屏幕输出结果):



    int a=5;
    int b=-6;
    int c=8+9;
    int d=5.99;    //只会储存到5,小数点后会被去掉
    printf("%d",a); //5


    可以看到,只要在变量名前面加上相应的数据类型,就可以声明相应的变量。而且变量同样是可以被格式声明符调用的


  2. 单精度浮点型(float)

    很多人上来看到单精度浮点型,会一脸懵逼,woc,这tm是个什么东西,又单精度又浮点的。其实通俗来讲单精度浮点型是一种小数类型(实数),关键字为:float,它最多可以完整储存6位小数,第7位只有部分有效,在我们日常开发中如果需要储存6位小数以下的数据就使用float,当然float也可以储存整数,但是不建议这么做。需要注意的是,给float赋值时,数值的后面需要加f或F(不加也可以,但是编译器可能会给警告,因为小数类型默认为double类型)。

    单精度浮点型定义例子:


    float abc=4.555555f;
    float abc2=-4.5F;
    float abc3=4f;
    float abc4=5.999999f;    //7位小数,不建议存储给float,很有可能会发生错误
    printf("%f",abc);        //4.555555
    printf("%f",abc2);       //-4.500000  因为使用%f的话,默认后面会用0补齐
    printf("%g",abc2);       //-4.5         如果使用%g的话,不会使用0补齐。

    因此可以认为,如果想完整输出float,可以使用%f和%g,它们的区别是是否使用0补齐小数点位数。事实上%f对应的是浮点型输出,%g对应的是实数输出,有可能大家对这个概念不太理解,但也不用太纠结。


  3. 双精度浮点型(double)

    有单精度浮点型自然会有双精度浮点型啦,不然单精度浮点型多孤单呀。双精度浮点型也是一种小数类型(实数),关键字为:double,它最多可以完整储存15位小数,第16位只有部分有效,在日常开发中如果需要储存7位小数以上,15位小数以下的数据就使用double,其他与float基本相同,但是给double赋值时,数据后面无需加任何字母。

    双精度浮点型定义例子:


    double abc=4.555555555555555;
    double abc2=4;
    double abc3=4.5555555555555555;        //16位小数,不建议存储给double,很有可能发生错误
    printf("%lf",abc2);              //4.000000
    printf("%lf",abc);               //4.555556
    printf("%lg",abc);               //4.55556
    printf("%.8lf",abc);       //4.55555556

    根据上面的代码,我们可以得出,double对应的格式声明符就是%lf和%lg。在这里大家可能会有疑惑,为什么我的double,储存了15位,但是给只给我输出了6位或5位小数,只是最后一位给四舍五入了呢?这是因为虽然我们的double可以存储15~16位,但是%f和lf其实都是默认只输出6位的,%g和%lg都只默认输出5位小数,如果想要输出更多小数,只能通过更改格式化声明符,就像我最后一行那样,在%和lf之间放上一个 【 . 】 后面跟上需要输出几位数,例如%.8lf这样,就代表输出8位小数,最后一位四舍五入。要注意,C语言这个四舍五入其实是有点小bug的,这个是其本身的问题,但不影响我们实际开发,而且只在特定的情况下出现,如果遇到四舍五入不准的情况可以不用惊慌。


    很多人可能还会有一个疑惑,%f和%lf以及%g和%lg有什么区别呢?其实这里的lf和lg中的l是long的意思,均表示长的意思,它们两个的精度相比%f和%g更高,当然在6位以下的double类型的情况下,使用%f和%g也是可以的(实际开发中大家经常会这么做),因为其实各种格式声明符不是严格对应某种类型的,只是代表将一段数据以某种固定的格式输出而已。


    再就是,需要记住,上面说的float和double的小数位,都是在最大的情况下,事实上,如果double储存了一个整数部分有10位的数字,那double最大只能再存储6位小数(如果说100%能储存的话,这种情况下最大只能储存5位小数),如果说满足不了大家需求的话,大家可以在double前面加一个long,也就是long double,long double的精度绝对不会比double低,但具体会取决于编译器,使用方法与double相同。


  4. 字符类型(char)

    字符类型其实很简单,通过名字应该就能知道,就是储存字符的数据类型,关键字为:char,但是要注意char类型只能存储一个字符,不能存储多个。

    字符类型例子


    char abc='a';
    char abc2='编';
    char abc3='*';
    printf("%c",abc);    //a

    char类型赋的值需要用单引号包裹起来(双引号是字符串类型,不能用在char类型里)。char类型对应的格式声明符为%c,作用就是输出字符。其实char类型也可以使用%d,如果使用%d的话会打印出字符对应的ANSC II码(关于ASCII码可以上网查一下)。


    很多同学可能会说,那我要输入一串字符串怎么办,总不能一个一个存吧(其实离真相很近了),先在这里提一下,我们可以使用数组的方式存储字符串,也就是像char abc[50]="abcde";   这样就可以存储一个字符串了,50则代表这个数组最大能存储的字符数,字符串数组对应的是%s。在这里就稍微提一下,这个具体以后会讲有感兴趣的同学可以下去试一下。




简单的格式声明符与数据类型对应表(不考虑特殊使用的情况)



数据类型

通常使用的格式声明符

int(整数型)

%d

%p(打印变量的内存地址)

float(单精度浮点型)

%f(打印小数时,会用0占位)

%g(打印实数时,不会用0占位)

%p(打印变量的内存地址)

double(双精度浮点型)

%lf(打印小数时,会用0占位

%lg(打印实数时,不会用0占位)

%p(打印变量的内存地址)

char

%c(打印单个字符时)

%d(打印存储的字符的ASCII码时)

%p(打印变量的内存地址)





-变量与运算符-


前面的时候稍微讲过一下C语言中如何进行计算,其实C语言中拥有数学中的一些计算符号,也就是运算符。下面稍微列举一些运算符(红色部分代表你在这一章必须要记住并明白什么意思的)。

  1. +       加号

  2. -        减号

  3. *        乘号

  4. /        除号

  5. %       模运算符

  6. ()        括号

  7. =        赋值运算符(注意,在编程语言中=号不代表等于)


  8. ++     自增(自己加1)

  9. --       自减(自己减1)


首先我们来讲一下加减乘除括号以及赋值,这些大家应该很熟悉,因为我们从小就开始接触这些,所以就不多讲了,看一下下面的例子应该就知道了。

int a=15;
int b=20;
float c=7.5f;

float plus=a+c;    //plus的值为22.5
float sub=b-c;     //sub的值为12.5
int mul=a*b;       //mul的值为300
float div=a/b;     //div的值为0.75
float bra=a*(b-c); //bra的值为187.5   当然float bra=a*sub;也可以,并且强烈建议这么写。但是这里为了演示运算符,就不这么写了。

看了上面的例子大家应该就理解了。可以看到我们使用变量进行计算,可以有效解决,在上一章出现的直接使用数字时,无法进行正常的小数计算的问题,这其实是因为,只要是数字间计算的结果,C语言编辑器默认为是整数类型,所以会导致最后结果有问题,如果提前定义好数据类型就不会发生这样的错误了。有不懂的地方可以留言或发给我邮件。

下面讲一下自增和自减运算符。


首先注意一点,必须是被初始化的变量才能使用增分减分运算符,也就是说这个变量必须要本身有一个值。如果直接像

int i;
i++;

这样是不可以的。

下面这样是可以的

int i=5;
int j;
j=3;

i++;
j--;


自增自减运算符有两种写法。


第一种写法为:后置增分减分运算符变量名++; 和 变量名--; 它们的作用都是让变量自增1或自减1。那么就有人问了,为什么不写 i-1; 这样呢,这不也是减去1了吗?其实是这样的i-1并不代表i本身减1,这种操作是对i没有任何影响的,只有i=i-1;这时i才能-1(写成i -=1)也可以,因为变量只有在被赋值的时候,它本身的值才会改变(自增自减运算符除外)。


第二种写法为:前置增分减分运算符++变量名; 和 --变量名; 它们在大部分时候和第一种写法一样,都是自增或自减。


那这两种写法在什么时候不同呢,只有在赋值的时候它们才会有区别。

第一种写法的话在赋值的时候,不会先自增或者自减,而是先将本身的值进行计算,在计算完成并赋值后,才会对本身的值进行自增自减。可以看看下面的例子。

int i=0;
int j=5;
i++;                //i的值为1
j--;                //j的值为4

int sumi=5+ i++;    //sumi的值为6    i在等于1时先与5相加,等于6,之后再自增,i等于2
int sumj=5+ j--;    //sumj的值为9    j在等于4时先与5相加,等于9,之后再自减,j等于3

printf("%d",i);    //2
printf("%d",j);    //3

如果感觉有点迷糊,只要记住++和--是自增1和自减1就行。


第二种写法的话与第第一种相反的,在赋值时会先自增自减,之后与其他数或变量再进行计算,之后再赋值。

例子(要记住++和--前面要是有其他运算符的话必须要空一个空格):

int i=0;
int j=5;
++i;                //i的值为1
--j;                //j的值为4

int sumi=5+ ++i;    //sumi的值为7    在计算之前i的值就+1了,i等于2,之后与5相加等于7
int sumj=5+ --j;    //sumj的值为8    在计算之前j的值就-1了,j等于3,之后与5相加等于8

printf("%d",i);    //2
printf("%d",j);    //3


通常来说,在不涉及赋值的情况下,我们一般使用第一种,也就是后置增分减分运算符,在涉及赋值的情况时,我们再考虑到底使用前置还是后置。


-课件及作业-


请将课件复制到课件合集(在上一章的附件里,应该让单独创建了项目)的#elif Lesson==2下面,#elif Lesson==3的上面。需要将最上方的#define Lesson 1改为#define Lesson 2,才能运行这部分代码

请将作业复制到作业合集(在上一章的附件里,应该让单独创建了项目)的#elif Lesson==2下面,#elif Lesson==3的上面。需要将最上方的#define Lesson 1改为#define Lesson 2,才能运行这部分代码

C语言入门教程(六)-变量与数据类型、运算符.zip


未经许可转载需联系su79767960@outlook.com

已有 174 位网友参与,快来吐槽:

发表评论

分享:

支付宝

微信

站点统计