C 语言基础教程(我的C之旅开始了)[五]

2016-02-19 11:49 8 1 收藏

下面这个C 语言基础教程(我的C之旅开始了)[五]教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

12. 基本数据类型:整型(下)

1. 输出各种整数类型的变量

    输出不同类型的整数,需要使用不用的格式限定符。输出 unsigned int 类型的整数,要用 %u 。输出 long ,要用 %ld;如果要以十六进制或者八进制形式输出,那就用 %lx(或者%lX)或者 %lo。注意:虽然整数常量的后缀使用大写或者小写英文字母都没关系,但是它们格式限定符必须使用小写!如果我们要输出 short 类型的整数,可以在 %d 中间加上前缀 h,也就是%hd;同理,%ho%hx(或者 %hX )分别表示以八进制或十六进制形式输出。前缀 hl 可以和 u 组合,表示输出无符号整数。例如:%lu 表示输出 unsigned long 类型的整数;%hu 表示输出unsigned short类型的整数。如果您的编译器支持C99,可以使用 %lld%llu 分别表示输出 long long 和 unsigned long long 。下面我们来看一个输出各种类型整数的程序:

        #include stdio.h

        int main(void)
        {
            unsigned int un = 3000000000; /* 我使用的编译器 int 是 32 位的 */
            short end = 200;              /* 而 short 是 16 位的      */
            long big = 65537;

            printf("un = %u and not %dn", un, un);
            printf("end = %hd and %dn", end, end);
            printf("big = %ld and not %hdn", big, big);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

            printf("Press ENTER to quit...");
            getchar();
            return 0;
        }

使用 Dev-C++ 编译运行这个程序输出结果如下:

        un = 3000000000 and not -1294967296
        end = 200 and 200
        big = 65537 and not 1
        Press ENTER to quit...

     这个程序表明,错误使用格式限定符会导致意想不到的输出。首先,错误使用 %d 来做无符号整型变量 un 的格式限定符,导致输出的是负数。这是因为我的计算机使用相同的二进制形式来表示 3000000000 和 -129496296 ,而计算机只认识二进制。所以,如果我们使用 %u 告诉 printf 输出无符号整数,输出的就是 3000000000;如果我们误用了 %d,那么输出的就是一个负数。不过,如果我们把代码中的 3000000000 改成 96 的话,输出就不会出现异常。因为 96 没有超出 int 的表示范围。
    然后,对于第二个 printf,无论我们使用 %hd 还是 %d,输出的结果都是一样的。这是因为 C 语言标准规定,当 short 类型值传递给函数时,要自动转化成 int 类型值。之所以转化成 int,是因为 int 被设计为计算机处理效率最高的整数类型。所以,对于 short 和 int 大小不同的计算机来说,把变量 end 转化成 int 类型再传递给函数,速度更快。如此说来,h 好像没有存在意义。其实不然。我们可以用 %hd 来看看较大的整数类型被截断成 short 类型的时候会是什么样的。
    而第三个printf,由于误用%hd,导致输出是1。这是因为,如果long是32位的话,65537的二进制形式便是 0000 0000 0000 0001 0000 0000 0000 0001,而 %hd 命令 printf 输出 short 类型的值,从而导致 printf 只对后 16 位进行处理,最终导致输出 1。
    在前面的教程里,我们说过,保证格式限定符的数目和参数数目一致是我们的责任。同样,保证格式限定符的类型和参数类型一致也是我们的责任!正如上面所说的那样,错误使用格式限定符会导致意想不到的输出!


2. 整数溢出

    首先请看以下程序:

            #include stdio.h

            int main(void)
            {
                /* 32 位 int 表示范围的上限和下限 */
                int i = 2147483647, j = -2147483648;
                unsigned int k = 4294967295, l = 0;

                printf("%d %d %d %dn", i, i+1, j, j-1);
                printf("%u %u %u %u %un", k, k+1, k+2, l, l-1);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

                printf("Press ENTER to quit...");
                getchar();
                return 0;
            }

使用 Dev-C++ 编译运行这个程序输出结果如下:

            2147483647 -2147483648 -2147483648 2147483647
            4294967295 0 1 0 4294967295
            Press ENTER to quit...

     这个程序中,i+1 是负数,j-1 是正数,k+1 是 0,l-1 是 4294967295 。这是因为加减运算过后,它们的值超出了它们对应的那种整数类型的表示范围,我们把这种现象称为溢出
    unsigned int 型变量的值如果超过了上限,就会返回 0,然后从 0 开始增大。如果小于 0,那么就会到达 unsigned 型的上限,然后从上限开始减小。就好像一个人绕着跑道跑步一样,绕了一圈,又返回出发点。int 型变量溢出的话,会变成负数,或者正数。
    对于 unsigned 类型的整数,它们溢出时的情况一定和上面描述的一样,这是标准规定的。但是标准并没有规定有符号整数溢出时会出现什么情况。这里描述的有符号整数溢出时出现的情况是最常见的,但是在别的计算机,使用别的编译器,也可能出现不同的情况。

13. 标识符命名规则
 

1. 长度限制

    C89 规定,编译器至少应该能够处理 31 个字符(包括 31)以内的内部标识符(internal identifier);而对于外部标识符(external identifier),编译器至少应该能够处理 6 个字符(包括 6)以内的外部标识符。所谓标识符,是指我们为变量(variable)、宏(macro),或者函数(function)等等取的名字。例如 int num; 这个语句中的 num 就是一个标识符。
    最新的 C99 标准规定,编译器至少应该能够处理 63 个字符(包括 63)以内的内部标识符;编译器至少应该能够处理 31 个字符(包括 31)以内的外部标识符。
    事实上,我们可以使用超出最大数目限制的字符来命名标识符,不过编译器会忽略超出的那部分字符。也就是说,如果我们用 35 个字符来命名变量,而那个编译器最多只能处理 31 个字符的变量名的话,那么多出的那 4 个字符就会被编译器忽略,只有前面的 31 个字符有效。有些古老的编译器只能处理 8 个字符以内的标识符,对于这样的编译器来说,标识符 kamehameha 和 kamehameko 是等价的,因为它们前面 8 个字符相等。


2. 可用字符和组合规则

    标准规定,标识符只能由大小写英文字母下划线(_),以及阿拉伯数字组成。标识符的第一个字符必须是大小写英文字母或者下划线,而不能是数字。

           合法命名   非法命名
             wiggles             $Z]**     /*      $、] 和 * 都是非法字符  */
              cat2            2cat      /*  不能以数字开头  */
             Hot_Tub         Hot-Tub    /*  - 是非法字符  */
             taxRate        tax rate    /*  不能有空格  */
             _kcab            don't     /*  ' 是非法字符  */

操作系统和 C 语言标准库里的标识符一般以下划线开头,这是约定俗成的。因此,我们应该避免使用下划线作为我们自己定义的标识符的开头。
    C 语言是大小写敏感的语言,也就是说,star、Star、sTar,stAr 和 STAR 等都是相互不同的标识符。
    我们不能用关键字保留标识符来给我们自定义的变量命名。关于关键字和保留标识符,请点击 关键字和保留标识符

来源:http://www.tulaoshi.com/n/20160219/1598749.html

延伸阅读
入门简介 变量 C++数据类型 C++操作符 C++中的函数 main函数 数组 字符串数组 字符串操作函数 C++是个强大的语言,可以用于做别的语言做不了的工作。但是,这种强大功能是有代价的。开始使用C++时,你可能会遇到内存溢出和访问失效等问题,使程序死机。这里用最简短的篇幅介绍C++语言基础。C++语言本身有专著介绍,这种书...
if语句 if语句用于测试条件并在条件为真时执行一桌或几条语句。 说明:if表达式后面不能带分号,否则它本身表示代码中的空语句,使编译器将空语句解释为在条件为真时执行的语句。 if (x == 10); // Warning! Extra semicolon! DoSomething(x); 这里DoSomething()函数总会执行,因为编译器不把它看成在条件为真时执行...
终于来到第二章了,真是不容易(呵呵,大家少安毋躁)。 这章总的来说就是对C#的一个总体的概述。首先通过对以往的编程语言(汇编,C/C++,java,vb)的回顾,强调这些语言与C#的联系及C#对这些语言优秀特性的继承,试图在其中打到C#的影子。然后对现在市面上流行的编程语言与C#进行比较,从而突出C#做为新一代的编程语言的重要性及优越性。之...
各位贵安了!(先别骂我)最近刚开学,所以事情就多了点,上网的时间也不多,所以一直这个文章的下一篇也没出来。能得到大家的抬爱,本人甚是感激!对于C#的学习我也是刚刚入门,有什么不对的地方,敬请指教!好了,闲言少叙,进入正题。 第一章。万事开头难,什么事,都得从第一步开始。这一章主要是对.NET的一个概述,使我们对.NET有个概...
从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构、分支结构、循环结构。 这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现这些程序结构。 本文将介绍这些基本语句及其应用,使读者对C程序有一个初步的熟悉, 为以后的学习打下基础。 C程序的语句 C程序的执行部分是由语句组成的。 程序的功能...

经验教程

641

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部