C陷阱与缺陷 第1章 词法“陷阱” 1.5 字符与字符串

    字符与字符串
    字符:用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。因此,对于采用ASCII字符集的编译器而言,'a'的含义与0141(八进制)或者97(十进制)严格一致。

    字符串:用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为零的字符'\0'初始化。

    printf("Hello world\n");
    与 
    char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', 0};
    char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', '\0'};                                
    printf(hello); 
    是等效的。

    单引号括起的一个字符代表一个整数,双引号括起的字符代表一个指针。
    char *slash = '/'; /*代表一个整数,slash却是一个指针,编译出错*/ 
    编译出错: 
    printf('\n');
    来代替正确的 
    printf("\n");      /*"\n"代表一个指针*/ 

    整型数(一般为16位或32位)的存储空间可以容纳多个字符(一般为8位),因此有的C编译器允许在一个字符常量(以及字符串常量)中包含多个字符。 
    一种方法是忽略多余的字符,最后的整数值即第一个字符的整数值;
    另一种方法是依次用后一个字符覆盖前一个字符,最后得到的整数值即最后一个字符的整数值。

    /* 
    ** integer_and_char_2.c
    */
    #include<stdio.h>
    #include<stdlib.h>

    int main( void ) {
        int i;
        char c;
        int isize = sizeof(int);
        int csize = sizeof(char);
        printf("sizeof(int) = %d, sizeof(char) = %d, sizeof(1) = %zd, sizeof('a') = %zd\n", isize, csize, sizeof(1), sizeof('a'));
        if (isize == 2 * csize) {
            /* there is a warning:
            ** [Warning] multi-character character constant[-Wmultichar]
            */
            i = (int)('ab');
            printf("1:i = %c\n", i);
        }
        if (isize == 4 * csize) {
            /* there is a warning:
            ** [Warning] multi-character character constant[-Wmultichar]
            */
            i = (int)('bcde');
            printf("b = %c, c = %c, d = %c, e = %c\n", 'b', 'c', 'd', 'e');
            printf("2:i = %c\n", i);
        }
    
        return EXIT_SUCCESS;
    }

输出:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值