数据类型、常量和变量

1.1示例程序

话不多说,附上一个代码

/* platinum.c    ——your weight in platinum */
#include <stdio.h>

int main()
{
    float weight;    /*你的体重*/
    float value;     /*相等重量的白金价值*/
    
    printf("Are you worth your weight in platinum?\n");
    printf("Let's check it out.\n");
    printf("Please enter your weight in pounds: ");

    /*获取用户的输入*/
    scanf("%f",&weight);
    /*白金的价格是每盎司$1700*/
    /*14.5833用于把英镑常衡盎司转换为金衡盎司*/
    value=1700.0*weight*14.5833;
    printf("Your weight in platinum is worth $%.2f.\n",value);
    printf("You are easily worth that!If platinum pricesdrop,\n");
    printf("eat more to maintain your value.\n");

    return 0;
}

程序输出:

1.1.1 剖析代码

(1)weight和value使用float类型,float类型可以存储带小数的数字。为了打印float类型的值,printf()函数使用%f来处理浮点值%.2中.2表示精确到只输出小数点后两位

(2)scanf()函数用于读取键盘的输入,%f表示读取一个用户从键盘输入的浮点值,&weight告诉scanf()把输入的值赋给weight变量。scanf通过&找到weight的地址

(3)scanf()和printf()的使用,突出了该程序的交互性,即用户能灵活输入数值,而不是改动程序来改变输出。

1.2变量与常量数据

数据:承载信息的数字和字符。

常量:在程序使用之前就已经预先设定好的数据类型,在整个程序过程中没有变化,称之为常量。

变量:在程序运行期间能改变或赋值的数据类型,称之为变量。

1.3数据:数据类型关键字

不同的数据类型之间有差异。如一些数据类型表示数据,一些数据类型表示字符。C通过识别一些基本的数据类型来区分和使用这些不同的数据类型。

对于常量而言,编译器会根据它的书写方式识别类型(42是整数,42.0是浮点数)。

对于变量来说,就需要在声明时为其指定类型。

关键字上一篇已经介绍,不过多累赘。

插入一点小知识:

关于位、字节和字

位(bit):最小的存储单元,存储0和1。位是计算机内存的基本构建块

字节(Byte):计算机的存储单元,1字节=8位

字(word):是设计计算机时给定的自然存储单元。

1.3.1整数

没什么可介绍的。

1.3.2浮点数

例:2.75、3.16E7、2e-8……

注:3.16E7=3.16\times 10^{7}

计算机把浮点数分成小数部分指数部分来表示,并且分来存储这两个部分。

从图中可以清晰看到,7.00和7在数值上虽然相同,但是存储方式完全不同。

1.4C语言基本数据类型

1.4.1  int类型

C语言中的整数类型可表示不同的取值范围和正负值。

int类型是有符号整型,即必须是整型。存储一个int要占用一个机器字长。取值范围最小为-32768~32767.系统用一个特殊位的值表示有符号整数的正负号。

1.声明int变量

格式:int + 变量 + ;    ,记得“;”

声明变量时,可以声明一个或多个。

例:int erns;、 int hogs,cows,goats;

2.初始化变量

初始化变量就是为变量赋一个初始值,初始化可以在声明中完成。如:int hogs = 21;

注:不要使用如int hogs,int cows=13;这种初始化

声明为变量创建和标记存储空间,并为其指定初始值。

3.int 类型常量

上面出现的13,21等都是整型常量整型字面量

4.打印int值

使用printf()函数打印,%d指明打印位置,称作转换说明,转换说明指定printf()用什么格式输出值,格式化字符串中每一个%d都要与一个int匹配,可以说int变量,常量或其他值为int类型的表达式。

5.八进制和十六进制

(1)整数转化

①十进制转二进制:利用短除法,​​​​​​​除二取余,倒序输出

②十进制转八进制和十六进制与转二进制相似,除以8或者16即可。

③二进制转十进制:10001_{2}=2^{4}\times 1+2^{3}\times 0+2^{2}\times 0+2^{1}\times 0+2^{0}\times 1=17

                                即:(10001)_{2}=(17)_{10}

④二进制转八进制:3位一组,高位不够则补零

⑤二进制转十六进制:4位为一组,高位不够则补零

(2)小数部分转化

①十进制转二进制:乘二取整,顺序输出

②十进制转八进制和十六进制相似,乘8或16取整。

③二进制转十进制:小数部分从小数点后一位指数为-1开始算起,以后依次为-2、-3……

④八进制和十六进制转成十进制:与二进制相似。

注:八进制和十六进制之间的转换需要先将它们转成二进制,再转化。

       用0x0X前缀表示十六进制。

6.显示八进制和十六进制

不同进制之间要使用不同的转换说明。十进制数字使用%d,八进制使用%o,十六进制使用%x。当要显示各进制前缀0、0x,必须分别使用%#o、%#x、%#X。

/*bases.c--以十进制、八进制、十六进制打印十进制数100*/

#include <stdio.h>

int main()
{
    int x = 100;

    printf("dec = %d; octal = %o; hex = %x\n",x,x,x);
    printf("dec = %d; octal = %#o; hex = %#x\n",x,x,x);

    return 0;
}

程序输出:

1.4.2其他整数类型

short int:16位、long int(long):32位 、long long int(long long):64位,属于有符号类型。

unsigned int和unsigned只用于非负值,属于无符号类型,可以表示更大的数

1.打印short、long、longlong、unsigned类型

打印unsigned int类型,使用%u,long,使用%ld,%lx表示以十六进制打印long整型,%lo表示八进制打印long整型。

/*print2.c--更多printf()的特性*/

#include <stdio.h>

int main()
{
    unsigned int un=3000000000;    /*int为32位和short为16位的系统*/
    short end = 200;
    long big = 65537;
    long long verybig = 12345678908642;

    printf("un = %u and not %d\n", un, un);
    printf("end = %hd and  %d\n", end, end);
    printf("big = %ld and not %hd\n", big, big);
    printf("verybig = %lld and not %ld\n", verybig, verybig);

    return 0;

}

输出程序:

1.4.3使用字符:char类型

char类型用于存储字符(如字符,标点等),但是从计算角度来说,char类型也是整型,因为它实际存储的是整数而不是字符,计算机使用数字编码来处理字符,ASCLL码,char占一个字节

1.字符常量和初始化

例:char grade = 'A';

在C中,用单引号括起来的单个字符被称为字符常量。

2.非打印字符

使用特殊的符号序列表示一些特殊的字符,叫转义字符。

\a:警报,发出蜂鸣,不会移动屏幕光标。警报字符不得改变活跃位置,活跃位置指的是显示设备中下一个光标出现的位置。

\f:把活跃位置移至下一页的开始处。

\n:把活跃位置移至下一行的开始处。

\r:把活跃位置移至当前行的开始处。

\t:将活跃位置移至下一个水平制表点。

\v:把活跃位置移至下一个垂直制表点。

\\:打印字符 \

\':打印字符 '

\":打印字符 “

注:无论是普通字符还是转义字符,只要双引号引起来就没必要用单引号。双引号中的字符集合叫作字符串

3.打印字符

%c打印字符。接下来程序演示了打印char的两种方式

/*charcode.c-显示字符的代码编号*/

#include <stdio.h>

int main()
{
    char ch;

    printf("Please enter a character.\n");
    scanf("%c",&ch);
    printf("The code for %c is %d.\n",ch,ch);

    return 0;
}

程序输出:

printf()函数中的转换说明决定了数据的显示方式,而不是数据存储方式。

1.4.4_Bool类型

用于表示布尔值,即逻辑值truefalse1表示true,0表示false,_Bool类型其实也是一种整数类型。原则上只占用一位存储空间。

1.4.5float、double和long double

1.0e9,浮点数在计算机中的写法,e后面的数字代表10的指数。

C语言规定,float类型必须至少能表示6位有效数字,且取值范围至少是10^{-37}~10^{+37}.通常,系统存储一个浮点要占用32位,其中8位用于指数的值和符号,剩下24位用于表示非指数部分及其字符。

double类型和float类型最小取值范围相同,但至少必须能表示10位有效数字。double占用64位

1.浮点型常量

基本形式:有符号的数字 + e/E+有符号的数表示指数。

如:-1.56E+12;2.87e-3

正号可以省略,可以没有小数点或指数部分,但是不能同时省略;可以省略小数部分或整数部分,但不能同时省略。

默认浮点常量是double类型精度,在浮点数后面加上f或F可覆盖默认设置。

2.打印浮点值

%f打印十进制计数法的float和double;%e打印指数计数法的浮点数,打印long double使用%f、%Le或%La。

程序演示:

/*showf_pt.c -- 以两种方式显示float类型的值*/

#include <stdio.h>

int main()
{
    float aboat = 32000.0;
    double abet = 2.14e9;
    long double dip=5.32e-5;

    printf("%f can be written %e\n",aboat,aboat);
    printf("And it's %a in hexadecimal, powers of 2 notation\n",aboat);
    printf("%f can be written %e\n",abet,abet);
    printf("%Lf can be written %Le\n",dip,dip);

    return 0;
}

程序输出:

3.浮点值的上溢和下溢

当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢。

计算过程中损失原来末尾有效值位上的数字,叫作下溢。

1.4.6复数和虚数类型

C语言有3种复数类型:float_Complex、double_Complex和long double_Complex。

C语言有3种虚数类型:float_Imaginary、double_Imaginary和long double_Imaginary

如果包含complex.h头文件,用complex代替_Complex,用imaginary代替_Imaginary。

1.4.7类型大小

如何知道当前系统指定类型大小多少,下列程序解惑:

/*typesize.c--打印类型大小*/

#include <stdio.h>

int main()
{
    printf("Type int has a size of %zd bytes.\n",sizeof(int));
    printf("Type char has a size of %zd bytes.\n",sizeof(char));
    printf("Type long has a size of %zd bytes.\n",sizeof(long));
    printf("Type long long has a size of %zd bytes.\n",sizeof(long long));
    printf("Type double has a size of %zd bytes.\n",sizeof(double));
    printf("Type long double has a size of %zd bytes.\n",sizeof(long double));
    
    return 0;
}

输出结果:

1.5参数和陷阱

传递给函数的信息被称为参数

例如,printf("Hello,pal."); 函数调用有一个参数:“Hello,pal”。双引号中的字符序列被称为字符串,一个字符串就是一个参数。

与此类似,scanf("%d",&weight),函数调用有两个参数,C语言用逗号分开参数。

1.6转义序列示例

上程序:

/*escape.c --使用转义序列*/

#include <stdio.h>

int main()
{
    float salary;

    printf("\aEnter your desired monthly salary:");    /* 1 */
    printf(" $_______\b\b\b\b\b\b\b");                 /* 2 */
    scanf("%f",&salary);
    printf("\n\t$%.2f a month is $%.2f a year.",salary,salary * 120);    /* 3 */
    printf("\rGee!\n");                                /* 4 */

    return 0;
}

输出结果:

1.6.1刷新输出

printf()何时把输出发送到屏幕上?

printf()语句把输出发送到一个叫作缓冲区的中间存储区域,然后缓冲区的内容再不断被发送到屏幕上。C语言明确规定了何时把缓冲区内容发送到屏幕上:当缓冲区满、遇到换行字符需要输入的时候(从缓冲区把数据发送到屏幕或文件被称作刷新缓冲区)。

注:C语言允许编写混合数据类型的表达式,但是会自动类型转换,以便统一。

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值