|
[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] |
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有