第三章 数据和C

本文详细介绍了C语言中的数据类型,包括整数类型、浮点数类型及其表示方法,以及如何使用scanf和printf函数进行数据输入输出。讨论了浮点数的存储方式、进制转换和整数溢出现象。此外,还涵盖了不同整数类型的使用场景,如short、int、long和unsigned。最后,提到了类型大小的检查方法以及在格式化输出时的注意事项和潜在问题。
摘要由CSDN通过智能技术生成

本章:

        两大数据类型:

        整数类型和浮点数类型(注意:char也是整数类型)

3.1

#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);

    getchar();//读取换行符,输入完毕
    getchar();//程序暂停,准备进行下一行

    value = 1700*weight*14.5833;
    printf("Your weight in platinum is worth $%.2f.\n",value);
    printf("You are easily worth that!If platinum prices drop,\n");
    printf("eat more to maintain your value.\n");

    return 0;
}

        scanf()函数用于读取键盘的输入%f说明scanf()要读取用户从键盘输入的浮点数,&weight告诉scanf()把输入的值赋给名为weight的变量。scanf()函数使用&符号表明找到weight变量的地点。 


        作用:

        scanf()函数读取用户从键盘输入的数据,并把数据传递给程序;printf()函数读取程序中的数据,并把数据显示在屏幕上。


        char关键字用于指定字母和其他字符(如,#、$、%和*)。另外,char类型也可以表示较小的整数。


浮点数:

        要理解浮点数和整数的储存方案不同。计算机把浮点数分成小数部分和指数部分来表示,而且分开存储这两部分。

        十进制下,可以把7.0写成0.7E1。这里,0.7是小数部分,1是指数部分。

        注意:因为在任何区间内(如,1.0到2.0之间)都存在无穷多个实数,所以计算机的浮点数不能表示区间内所有的值。浮点数通常只是实际值的近似值。例如,7.0可能被储存为浮点值6.99999。


        获取值的方法:1.赋值。 2.通过函数获得。如scanf。 3.初始化变量

        最好不要把初始化的变量和未初始化的变量放在同一条声明中。 

如图所示:

在int声明变量的时候就已经创建了内存空间,而不是赋值之后才有。


        %d 称为转换说明,它指定了printf()应使用什么格式来显示一个值。d指明了打印整数。格式化字符串中的每个d都与待打印变量列表中相应的int值匹配。

3.2 print1.c

/*print1.c - 演示printf()的一些特性*/
#include <stdlib.h>

int main()
{
    int ten = 10;
    int two = 2;

    printf("Doing it right:");
    printf("%d minus %d is %d\n",ten,2,ten-two);
    printf("Doing it wrong:");
    printf("%d minus %d is %d\n",ten,5);//遗漏第三个参数

    return 0;
}


注意:使用printf()函数时,要确保转换说明的数量与待打印值的数量相等。

3.3 base.c

/*base.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;
    //结果:dec = 100; octal = 144;hex = 64
    //      dec = 100; octal = 0144;hex = 0x64
}

进制:

        0x或0X前表示十六进制值,所以十进制数16表示成十六进制是0x10或0X10。与此类似,0前表示八进制。例如, 十进制数16表示成八进制是020。 


如果要在八进制和十六进制值前显示0和0x前,要分别在转换说明中加入#。


其他数据类型:

        short int 占用的存储空间可能比int类型少。

        unsigned int或unsigned只用于非负数。

使用多种整数类型的原因:

        C语言只规定了short占用的存储空间不能多于int,long占用的存储空间不能少于int。这样规定是为了适应不同的机器。

        个人计算机上最常见的设置是,longlong占64位,long占32位,short占16位,int
占16位或32位。

        int类型那么多,应该如何选择?首先,考虑unsigned类型。这种类型的数常用于计数,因为计数不用负数。而且,unsigned类型可以表示更大的正数。其他的int值因你数据的大小而选择。


        要把一个较小的常量作为long类型对待,可以在值的末尾加上l(小写的L)或后缓。使用L后缓更好,因为l看上去和数字1很像。因此,在int为16位、long为32位的系统中,会把7作为16位储存(int),把7L作为32位储存(long)。


整数溢出:

         当达到它能表示的最大值时,会重新从起始点开始。整数i也是类似的情况。它们主要的区别是,在超过最大值时,unsignedint类型的变量了从0开始;而int类型的变量i则从-2147483648开始。


3.4 print2.c

/*print2.c--更多printf()的特性 */
#include <stdio.h>
int main()
{
    unsigned int un = 3000000000;
    short end = 200;
    long big = 65537;
    long long verybig = 12345678908642;

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

    char beef = '\a';
    printf("%c",beef);
    return 0;
}

         打印unsigned int类型的值,使用%u转换说明,打印long类型的值,使用%ld转换说明。%lx表示以十六进制格式打印long类型整数,%lo表示以八进制格式打印long类型整数。

        printf(),对于short类型,可以使用h前缀。%hd表示以十进制显示short类型的整数,%ho表示以八进制显示short类型的整数。 h和l前都可以和u一起使用,用于表示无符号类型。例如,%lu表示打印unsigned long类型的值。

3.5 charcode.c

/*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;
}

3.6 altnames.c

/*altnames.c -- 可移值整数类型名*/
#include <stdio.h>
#include <inttypes.h>
int main()
{
    int32_t me32;

    me32 = 45933945;
    printf("First, assume int32_t is int: ");
    printf("me32 = %d\n",me32);
    printf("Next, let's not make any assumptions.\n");
    printf("Instead, use a \"macro\" from inttypes.h ");
    printf("me32 = %" PRId32 "\n",me32);
    return 0;
}

3.7 showf_pt.c

/* showf_pt.c -- 以两种方式显示float类型的值 */
#include <stdio.h>
//有问题待解决!!!
int main(void)
{
    float aboat = 32000.0;
    double abet = 2.14e9;
    long double dip = 5.32e-5;

    printf("%f can be written %e\n", aboat, aboat);//f打印的是float或double。e打印的是科学计数法的格式
    //下一行要求编译器支持C99或其中的相关特性
    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);//LF,Le说明dip是long double。尽量用大写L,因为小写和数字1难以区分!
    //这里第三个输出结果和书上不一致!!
    return 0;
}

3.7.1 floaterr.c

/*floaterr.c--演示舍入错误*/
#include <stdio.h>

int main()
{
    float a,b;

    b = 2.0e20 + 10;
    a = b - 2.0e20;
    printf("%f\n",a);

    return 0;
}
//数值越界,计算机缺少足够的小数位来完成正确的运算。

3.8 typesize.c

/* typesize.c -- 打印类型大小 */
#include <stdio.h>
int main(void)
{
    /* C99为类型大小提供%zd转换说明 */
    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;
}

效果:

检验了一下,%zd和%d效果没有区别。只是%zd用来特定表示sizeof()的返回类型

3.9 badcount.c

/* badcount.c -- 参数错误的情况 */
#include <stdio.h>
int main()
{
    int n = 4;
    int m = 5;
    float f = 7.0f;
    float g = 8.0f;

    printf("%d\n", n, m); /* 参数太多 */
    printf("%d %d %d\n", n);/* 参数太少 */
    printf("%d %d\n", f, g);/* 值的类型不匹配 */

    return 0;
}

3.10 escape.c

/* escape.c -- 使用转移序列 */
#include <stdio.h>

int main()
{
    float salary;

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

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值