源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-11-30 03:50 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C 语言基础教程(我的C之旅开始了)[五]
12. 基本数据类型:整型(下)

[b]1. 输出各种整数类型的变量[/b]     输出不同类型的整数,需要使用不用的[b]格式限定符[/b]。输出 unsigned int 类型的整数,要用[b]%u[/b] 。输出 long ,要用[b]%ld[/b];如果要以十六进制或者八进制形式输出,那就用[b]%lx[/b](或者[b]%lX[/b])或者[b]%lo[/b]。注意:虽然整数常量的后缀使用大写或者小写英文字母都没关系,但是它们格式限定符[b]必须使用小写[/b]!如果我们要输出 short 类型的整数,可以在 %d 中间加上[b]前缀[/b][b]h[/b],也就是[b]%hd[/b];同理,[b]%ho[/b] 和[b]%hx[/b](或者[b]%hX[/b] )分别表示以八进制或十六进制形式输出。前缀[b]h[/b] 和[b]l [/b]可以和[b]u[/b] 组合,表示输出无符号整数。例如:[b]%lu[/b] 表示输出 unsigned long 类型的整数;[b]%hu[/b] 表示输出unsigned short类型的整数。如果您的编译器支持C99,可以使用[b]%lld[/b] 和[b]%llu[/b] 分别表示输出 long long 和 unsigned long long 。下面我们来看一个输出各种类型整数的程序:         #include[b]<[/b]stdio.h[b]>[/b]         int main(void)         {             unsigned int un = 3000000000; /* 我使用的编译器 int 是 32 位的 */             short end = 200;              /* 而 short 是 16 位的      */             long big = 65537;             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("Press ENTER to quit...");             getchar();             return 0;         } 使用[b][url=http://cpp.ga-la.com/html/1/15/0510/12.htm]Dev-C++[/url][/b] 编译运行这个程序输出结果如下:         un = 3000000000 and not -1294967296         end = 200 and 200         big = 65537 and not 1         Press ENTER to quit...      这个程序表明,错误使用格式限定符会导致意想不到的输出。首先,错误使用 %d 来做无符号整型变量 un 的格式限定符,导致输出的是负数。这是因为我的计算机使用相同的二进制形式来表示 3000000000 和 -129496296 ,而[b]计算机只认识二进制[/b]。所以,如果我们使用 %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。     在前面的教程里,我们说过,[b]保证格式限定符的数目和参数数目一致[/b]是我们的责任。同样,[b]保证格式限定符的类型和参数类型一致[/b]也是我们的责任!正如上面所说的那样,错误使用格式限定符会导致意想不到的输出! [b]2. 整数溢出[/b]     首先请看以下程序:             #include[b]<[/b]stdio.h[b]>[/b]             int main(void)             {                 /* 32 位 int 表示范围的上限和下限 */                 int i = 2147483647, j = -2147483648;                 unsigned int k = 4294967295, l = 0;                 printf("%d %d %d %d\n", i, i+1, j, j-1);                 printf("%u %u %u %u %u\n", k, k+1, k+2, l, l-1);                 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 。这是因为加减运算过后,它们的值超出了它们对应的那种整数类型的表示范围,我们把这种现象称为[b]溢出[/b]。     unsigned int 型变量的值如果超过了上限,就会返回 0,然后从 0 开始增大。如果小于 0,那么就会到达 unsigned 型的上限,然后从上限开始减小。就好像一个人绕着跑道跑步一样,绕了一圈,又返回出发点。int 型变量溢出的话,会变成负数,或者正数。     对于 unsigned 类型的整数,它们溢出时的情况一定和上面描述的一样,这是标准规定的。但是标准并没有规定有符号整数溢出时会出现什么情况。这里描述的有符号整数溢出时出现的情况是最常见的,但是在别的计算机,使用别的编译器,也可能出现不同的情况。

[b]13. 标识符命名规则 [/b]
 
[b]1. 长度限制[/b]     C89 规定,编译器至少应该能够处理[b]31[/b] 个字符(包括 31)以内的[b]内部标识符[/b](internal identifier);而对于[b]外部标识符[/b](external identifier),编译器至少应该能够处理[b]6[/b] 个字符(包括 6)以内的外部标识符。所谓[b]标识符[/b],是指我们为变量(variable)、宏(macro),或者函数(function)等等取的名字。例如 int num; 这个语句中的 num 就是一个标识符。     最新的 C99 标准规定,编译器至少应该能够处理[b]63[/b] 个字符(包括 63)以内的内部标识符;编译器至少应该能够处理[b]31[/b] 个字符(包括 31)以内的外部标识符。     事实上,我们可以使用超出最大数目限制的字符来命名标识符,不过编译器会[b]忽略超出的那部分字符[/b]。也就是说,如果我们用 35 个字符来命名变量,而那个编译器最多只能处理 31 个字符的变量名的话,那么多出的那 4 个字符就会被编译器忽略,只有前面的 31 个字符有效。有些古老的编译器只能处理 8 个字符以内的标识符,对于这样的编译器来说,标识符 kamehameha 和 kamehameko 是等价的,因为它们前面 8 个字符相等。 [b]2. 可用字符和组合规则[/b]     标准规定,标识符只能由[b]大小写英文字母[/b],[b]下划线[/b](_),以及[b]阿拉伯数字[/b]组成。标识符的第一个字符必须是大小写英文字母或者下划线,而不能是数字。            [b]合法命名[/b]  [b]非法命名[/b]              wiggles             $Z]**     /*      $、] 和 * 都是非法字符  */               cat2            2cat      /*  不能以数字开头  */              Hot_Tub         Hot-Tub    /*  - 是非法字符  */              taxRate        tax rate    /*  不能有空格  */              _kcab            don't     /*  ' 是非法字符  */ 操作系统和 C 语言标准库里的标识符一般以下划线开头,这是约定俗成的。因此,我们应该避免使用下划线作为我们自己定义的标识符的开头。     C 语言是大小写敏感的语言,也就是说,star、Star、sTar,stAr 和 STAR 等都是相互[b]不同的[/b]标识符。     我们不能用[b]关键字[/b]和[b]保留标识符[/b]来给我们自定义的变量命名。关于关键字和保留标识符,请点击[b][url=http://cpp.ga-la.com/html/1/2/0510/21.htm]关键字和保留标识符[/url][/b]

  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部