2.1.2 变量定义
#include<stdio.h>
int main()
{
printf("100-79=%d",100-79);
return 0;
}
之前写到的程序实际上都是预先编写好再输出的,如果想要在程序运行过程中做到输入一个数再给出相关结果,该怎么做呢?
要达到这样的目的需要三个条件:
- 要能存放输入的数字
- 要能从外部输入数字(从键盘或者别的输入读取)
- 输入的数字能参与计算
先来看一个采用了这种方法的程序:
#include<stdio.h>
int main
{
int price=0;
printf("请输入金额:");
scanf("%d",&price);
int charge = 100 - price;
printf("找您%d元",charge);
return 0;
}
运行结果如下:
请输入金额:30(用键盘输入一个数字,假设键盘敲下30并回车)
找您80元
2.1.3 变量赋值和初始化
程序里的int price = 0;
这里定义了一个变量叫price,它的类型是int(整数型),它的初始值是0。
变量,就是我们上面提到的问题中用来存放数据的地方,能在程序运行过程中保存输入的数据,参与到之后的计算之中,并且在程序结束之后销毁。
- 当有多个变量需要定义时,可以在一行里用逗号隔开相同类型的变量节省空间。
- 但是变量的赋值,初始化需要每个变量分开写。如:
int a,b,c=0;(此时ab都没有初始化)
int a=0,b=0,c=0,d=1;(此时全部初始化)
变量的赋值,“ = ”在C中是赋值运算,把右边的值赋给左边的变量,price = 0;意思就是把0赋值给price这个变量,此时我们完成了对变量赋初始值,这个操作叫初始化,初始化的意义与计算机运行原理有关,因为在定义变量的时候,计算机会在内存里开辟一块空间,此时直接读取这个变量的值的话会得到它的内存地址,如果在运算中没有初始化,这个值(内存地址)就可能会直接参与计算,进而得到错误结果。所以在变量第一次被使用(也就是出现在赋值号右边)之前,要么就给他初始化为0,要么就给他赋别的值。
变量的名字叫标识符,是用来区分变量和别的东西,给变量起名不能瞎起,标准是:
- 字母,数字,下划线,而且数字不能打头。
- int,for ,char,double之类的不能起,不用背,这些是C语言的关键字(也叫保留字),如果用了会报错
前面提到“ = ”是一个赋值运算符,我们把带有赋值运算符的式子叫做“ 表达式(Expression)”,比如:
- price = 0;
- charge = 100 - price ;
这些都是表达式。是带有赋值运算符的式子 。
那么为什么要对变量进行赋值,初始化和定义呢?
“C语言是一种有类型的语言,所有的变量都需要在使用之前定义或者声明,所有的变量都需要有确定的数据类型。数据类型决定了能在变量里存储什么类型的数据,变量里只能存放指定类型的数据,运行过程中不能改变变量类型。” ——翁恺老师PPT
害,说白了就是规定。 ——Icyoung
2.1.4 变量的输入
上面的程序中有一句:
scanf("%d",&price);
用来读入键盘输入的值,语句含义是将下一个读入的整数赋值给逗号后面的price变量,变量前面一定要加上“ & ”。
“要是我就不输入整数呢?”——某罔柴说。
这里输入了45.7,不是一个整数,程序直接给了一个55的返回值,说明小数点之后的数字被抹掉了。
输入一句友好的问候,店主直接把钱退给我,让我把东西放下滚蛋了。
开个玩笑,所以说如果输入带小数的值,程序会读入其中的整数,而输入字符串时,程序不会读入数据。
“那我咋才能同时读入多个变量值呢?”——某罔柴问。
好说,只需要这样写,假设有三个变量:
int a=0,b=0,c=0;
scanf("%d %d %d",&a,&b,&c);
printf("%d,%d,%d",a,b,c);
“这又有什么说法?%d中间为什么要加空格?”
scanf的读入功能比较死板,假如写成%d,%d,%d,你输入时候就必须按照xxx,xxx,xxx的格式来输入(必须要带上那个逗号),当然可能有特殊用处。而我们输入时候希望容错率高一点,带空格的这种写法,在你输入一个数字之前输入空格或者回车的话是不会读入空格和回车的。
2.1.5 常量和变量
前面的程序里有一句
int charge = 100 - price ;
100这个常数直接写在了程序里,我们称它为直接量(literal),比起直接写一个数来说,更好(更nb)的办法是定义一个常量:
const int JINE = 100;(const:不变的,类型是int,名为JINE的常量,一般都是全大写)
则上面那句也就可以改为:
int charge = JINE - price;
这里可以窥见其好处,直接写个100,不知道是什么,与直接量不同,常量是带有名称的,也便于之后修改程序。常量定义以后就不能在之后的程序中修改,如果后面出现给常量赋值的语句会直接报错。
2.1.6 浮点数
先引入一个问题:五尺七寸转换为米制单位是多少?
给出转换公式为:(英尺+英寸/12)*0.3048,写一个计算身高的程序:
#include<stdio.h>
int main()
{
printf("请输入身高的英尺和英寸,如输入\"5 7\"表示5英尺7英寸:\n");
int foot;
int inch;
scanf("%d %d",&foot,&inch);
printf("身高是%f米",((foot+inch/12)*0.3048));
return 0;
}
输出结果如下:
但(5+7/12)*0.3048=1.7018
???这是为什么?
原来是因为foot和inch的类型都是整数,而整数相乘的结果只能是整数,其中7/12这个式子的小数部分就被舍弃掉,计算结果就和正确答案有所偏差了。
再说两个例子:
- 10/3*3 = 10? NO,实际上结果是9
- 10是整数,10.0是浮点数。因此10.0/3*3 = 10.0。
此时我们可以引入“浮点数”的概念:带小数的数值(小数点是浮动的)
然后是C语言一个重要特性:
当浮点数和整数在一起运算时,C语言会自动把整数转换为浮点数,然后进行浮点数的运算
因此,只需要把上方程序改为
printf("身高是%f米",((foot+inch/12.0)*0.3048));
就可以得到正确结果。
或者也可以将foot,inch的类型直接改为浮点型,即
double/float foot=0,inch=0;
如果用double/float,scanf中需要把%d替换为%lf。printf中把%d替换为%f。