C语言学习(七)C语言变量初识、简单了解变量如何放入内存中、在屏幕上输出各种类型数据、字符串中长文本的书写

C语言变量初识、简单了解变量如何放入内存中、在屏幕上输出各种类型数据、字符串中长文本的书写

回顾、引入

在我们了解变量前,先回顾一下之前提到的内容。在C语言学习(三)内存初识、数据在内存中的保存形式、程序载入内存中曾经提到过:

  • 数据是以二进制的形式存放在内存中的
  • 我们将8个比特(Bit)称为一个字节(Byte),并将字节作为最小的可操作单元

我们不妨从最简单的整数开始说起,看看它是如何放到内存中去的。

变量(Variable)

现实生活中我们常常会找一个小箱子来存放物品,为了使其显得不那么的乱,也方便我们后续找到。计算机也是这个道理,在存储前,我们先要在内存中找到一块区域,规定用它来存储整数,并且起一个好记的名字,方便以后的查找。这块区域就是“小箱子”,我们可以把整数放进去。

在C语言中,这样表示在内存中找一块区域:

int a;

int是一个新单词,他是Integer的简写,意思是整数。a就是我们给这块内存取的名字;当然,也可以是其他名字,如abc,a123等。

这个语句的意思是:在内存中找一块区域,命名为a,用来存放整数。

注意,int和a之间是有空格的,他们是两个词。另外,注意结尾的分号,int a表达了一个完整的语句,要用分号来结束

int a;只是仅仅是在内存中找了一块可以保存整数的区域,那么如何将123、999、100等整数放进去呢?

C语言中这样像内存中存放整数:

a = 123;

=是一个新符号,数学中我们叫“等于号”,如1+1=2。但在C语言中,这个过程叫做赋值(Assgin)。赋值是指把数据放到内存的过程。

将上面两个语句连起来:

int a;
a = 123;

这样就把123放到了一块叫a的内存中。也可以写成一个语句

int a = 123;

a中的整数在我们需要的时候,也可以随时更改。更改的方式就是再次赋值,比如:

int a = 123;
a = 1000;
a = 9999;

第二次赋值,会把第一次的数据覆盖掉,也就是说,a中最后的值是9999,123、1000已经不存在了,再也找不回来了。

因为a的值会改变,所以我们给他起了一个形象的名字,叫做变量(Variable)。

int a; 创造了一个变量a,我们把这个过程叫做变量定义。a = 123;把123交给了变量a,我们把这个过程叫做给变量赋值;由于是第一次赋值,这种也称为变量的初始化,或者赋初值

你可以先定义变量,再初始化,比如:

int a;
a = 123;

也可以在定义的同时进行初始化:

int a = 123;

这两种方式是等价的。

数据类型

变量是放在内存中的,变量是给这块内存起的名字,有了变量就可以找到并使用这块数据。那么,我们如何使用这些数据呢?

我们知道,在计算机中,像数字、符号、图片、音频、视频等数据都是以二进制形式存储在内存中的。对于计算机来说,他们本质上没有区别。那么00010000是该理解为数字16呢,还是某个图片中像素的颜色呢,或者是某个声音?如果没有特别指明,我们并不知道。

也就是说,内存中的数据有多种解释方式,使用前必须要确定。上面的int a;就表明这份数据是整数,不能理解为像素、声音等。int有一个专业的称呼,叫做数据类型(DataType)

数据类型用来说明数据的类型,确定了数据的解释方式,让计算机和程序员不会产生歧义。在C语言中,有多种数据类型,例如:

说明字符型短整型整型长整型单精度浮点型双精度浮点型无类型
数据类型charshortintlongfloatdoublevoid

这些是最基本的数据类型,是C语言自带的,如果我们需要,还可以通过他们组成更加复杂的数据类型,后面我们会一一讲解。

连续定义多个变量

为了让程序书写的更加简洁,C语言支持多个变量的连续定义,例如:

    int a = 10, b, c;
    float fa, fb, fc = 1.0;
    char ca = '*', cb = '@';

数据的长度(Length)

所谓数据长度(Length),是指数据占用多少个字节。理论上来说,占用的字节越多,能存储的数据就越多。对于数字来说,值就会更大,反之存储的数据就有限。

多个数据在内存中是连续存储的,彼此之间没有连续的界限,如果不指明数据的长度,计算机就不知道何时存取结束。

所以,在定义变量时要指明数据的长度。而这恰好就是数据类型的另外一个作用。数据类型除了能指明数据的解释方式,还指明了数据的长度。在C语言中,每一种数据类型所占用的字节数都是固定的,知道了数据类型,就知道了数据的长度。

在32位的环境中,各种数据类型的长度一般如下:

说明字符型短整型整型长整型单精度浮点型双精度浮点型
数据类型charshortintlongfloatdouble
长度124448

补充知识以及上述知识总结

数据是放在内存中的,在内存中存取数据要明确三件事:

  • 数据存储在哪里
  • 数据的长度
  • 数据的处理方式

变量名不仅仅是为数据起一个好记的名字,还告诉我们数据存在哪里,使用数据时,只要提供变量名即可;而数据类型则指明了数据的长度和处理方式。

C语言提供多种数据类型让程序更加灵活高效,同时也增加了学习成本。而有些编程语言,如PHP、JavaScript等,在定义变量时不需要指明数据类型,编译器会根据赋值情况自动推演出数据类型,更加智能。

除了C语言,Java、C++等在定义变量时也必须指明数据类型,这样的编程语言称为强类型语言。而PHP、JavaScript等,在定义时不必指明数据类型,编译器会自动推演,这样的编程语言称为弱类型语言

强类型语言一旦确定了数据类型,就不能再赋给其他类型的数据,除非对数据类型进行转换。弱类型语言没有这种限制,一个变量可以赋给一个整数,然后再赋给一个字符串。

最后需要说明的是,数据类型只在定义变量时声明,而且必须指明;使用变量时无需再指明,因为此时的数据类型已经确定了。

后面我们会详细对各种数据变量的存储详细介绍,此篇暂时只做一个初步的了解。

在屏幕上输出各种类型数据(后续文章会提前用到的知识)

在前面我们了解到,使用puts可以来输出字符串。puts是output string的缩写,只能用来输出字符串,不能输出小数、字符等,我们需要另一个函数,那就是printf

printf比puts更强大,不仅可以输出字符串,还能输出小数、整数、单个字符等,并且输出的格式也能自己定义,如:

  • 以十进制、八进制、十六进制形式输出
  • 要求输出的数字占n个字符的位置
  • 控制小数的位数

printf是print fomat的缩写,意思是“格式化打印”。所谓的打印就是在屏幕上显示内容,与“输出”含义相同,所以我们一般称printf是用来格式化输出的。

先看一个例子:

printf(“Hello World”);

这个语句可以在屏幕上显示“Hello World”,与puts(“Hello World”)效果类似。

输出变量abc的值:

    int abc = 999;
    printf("%d",abc);

先来看看%d,d是decimal的缩写,意思是十进制数,%d表示以十进制的形式输出。输出什么呢?输出abc的值。%d与abc是对应的,也就是说,会用abc的值来替换%d

再看个复杂点的:

    int abc = 999;
    printf("The value of abc is %d",abc);

会在屏幕上显示
The value of abc is 999

由此可见,字符串“The value of abc is %d”中的%d被替换成了abc的值,其他字符没有变。这说明%d比较特殊,不会原样输出,会被替换成对应变量的值。

再来看:

    int a = 100, b = 200, c = 300;
    printf("a=%d,b=%d,c=%d", a, b, c);

会在屏幕上显示
a=100,b=200,c=300

再次证明了%d与后面的变量是一一对应的。

%d被称作格式控制符,他指明了以何种形式输出数据。格式控制符都以%开头,后跟其他字符。%d表示以十进制输出一个整数。除了%d,printf还支持更多的格式控制,比如:

  • %c:输出一个字符串。c是character的缩写
  • %s:输出一个字符串。s是string的缩写
  • %f:输出一个小数。f是float的缩写

除了这些,printf还支持更加复杂的输出格式,我们会在后面详细说说C语言的输入输出。

较为完整的输出演示:

    int n = 100;
    char cc = '@';  //单引号包围
    float money = 93.96;
    printf("n=%d, cc=%c,money=%f \n", n, cc, money);

输出结果:
n=100,cc=@,money=93.959999

要点提示:

  1. \n是一个整体,组合在一起表示换行字符。我们后面会单独说转义字符,这里先记住,\n表示换行。

所谓换行,就是让文本从下一行的开头输出,相当于在word和txt下按下了回车键。

puts在输出完成后会自动换行,而printf不会,要自己添加换行符。这也是puts和printf在输出字符串时的一个区别。

  1. //后面的为注释,用来说明代码时什么意思,起到提示的作用,帮助我们理解代码。注释不会给程序带来任何影响,编译器在编译阶段会忽略注释的内容,或者说删除注释的内容。我们会在后面详细注释等概念。
  2. 注意money后面输出的值很奇怪,并不是我们想象中的93.96,而是一个近似值。这与小数本身的存储机制有关。我们会在后面一一详细分析。

再来看一个例子:

    int a = 100;
    printf("a=%ds", a);

请大家想想,此时输出会是什么?

运行结果:
a=100s

从输出结果可以发现,%d被替换成了a的值,而s没有变。这是因为%d才是格式控制符,%ds在一起没有意义,s仅仅是跟在%d后面的一个字符,所以会原样输出。

(拓展)如何在字符串中书写长文本

如果我们需要在屏幕上输出一段比较长的文本,它的内容为:

我认为阅读对人们来说是终身受用的。阅读有许多好处。首先,读书可以使我们增长见识,不出门,便可知天下事。其次,读书能够使我们的阅读和写作能力提高。在你学会如何写之前,你得先知道别人怎么写。

将文本放在一个字符串中,他会显得比较臃肿,如:

    puts("我认为阅读对人们来说是终身受用的。阅读有许多好处。首先,读书可以使我们增长见识,不出门,便可知天下事。其次,读书能够使我们的阅读和写作能力提高。在你学会如何写之前,你得先知道别人怎么写。")

可见不太美观,也影响我们整体的查看,我们可以改成下面这种:

    puts("我认为阅读对人们来说是终身受用的。");
    puts("阅读有许多好处。");
    puts("首先,读书可以使我们增长见识,不出门,便可知天下事。");
    puts("其次,读书能够使我们的阅读和写作能力提高。");
    puts("在你学会如何写之前,你得先知道别人怎么写。");

你也可以这么做:

    puts(
        "我认为阅读对人们来说是终身受用的。"
        "阅读有许多好处。"
        "首先,读书可以使我们增长见识,不出门,便可知天下事。"
        "其次,读书能够使我们的阅读和写作能力提高。"
        "在你学会如何写之前,你得先知道别人怎么写。"
    );

也不一定要换行,也可以这样:

    puts("阅读对人们来说是终身受用的。"  "阅读有许多好处。" "读书可以使我们增长见识");

在puts函数中,可以将一个较长的字符串分割成几个较短的字符串,这样会使文本的格式更加整齐。

注意,这只是形式上的分割,编译器在编译阶段会将他们分割成一个字符串,他们放在一块连续的内存中。

不仅仅是puts、printf,后面我们将要提到的fprints、fputs等与字符串输出有关的相关函数,都支持这种写法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JayerZhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值