cgg之字面值

字面值时源代码中用来描述固定值的记号,可能是整数、浮点数、字符或者字符串

2.1 整数常量

除了常见的十进制数外,还有八进制(以数字0开头)或者十六进制(0x/0X)表示法。

#include <stdio.h>

int main()
{
    int x = 010;
    int y = 0x0A;

    printf("x=%d,y=%d\n",x,y);
    return 0;
}

输出:

x=8,y=10

常量类型可以通过后缀来区分类型

0x200 -->int
200U  -->unsigned int

0L     -->long
0xf0f0UL -->unsigned long

0777LL --->long long
0xFFULL --->unsigned long long

2.2 浮点常量

默认浮点常量是double,可以用F后缀表示float,用L后缀表示long double

    printf("%f\n",0.111111111F);
    printf("%f\n",0.11111);
    printf("%Lf\n",0.9999999999L);
    printf("%Lf\n",0.99L);

输出:

0.111111
0.111110
1.000000
0.990000

对于long double输出必须使用%Lf的格式,否则输出结果是错误的。

2.3 字符常量

字符常量默认是int类型,除非用前置L表示wchar_t宽字符类型

#include <stdio.h>
#include <locale.h>

int main()
{
int i;
    
    printf("%c,%c,%c\n",c,c2,c3);

    setlocale(LC_CTYPE,"en_US.UTF-8");
    wchar_t wc = L'';

    char buf[100] = {};

    int len = wctomb(buf,wc);

    printf("%d\n",len);

    for(i = 0; i<len; i++)
        printf("0x%02X ",(unsigned char)buf[i]);
    printf("\n");

    return 0;
}

输出:

3
0xE4 0xB8 0xAD 

使用python进行验证

>>> astr=''
>>> astr
'\xe4\xb8\xad'

结果正确。

 

2.4 字符串常量

C语言中的字符串是一个以NULL(也就是\0)结尾的char数组。

空字符串在内存中占用一个字节,包含一个NULL字符。

char s[] = "Hello,World!\n";
printf("strlen=%d\n",strlen(s));
printf("sizeof=%d\n",sizeof(s));

#输出结果为:

strlen=13
sizeof=14
------------------------------------------------------------------
char* ps = "Hello,World!\n";
printf("strlen=%d\n",strlen(ps));
printf("sizeof=%d\n",sizeof(ps));

#输出结果为:
strlen=13
sizeof=8  #是指针char*代表的大小

 

 

同样可以使用L前缀声明一个宽字符串。

#include <stdio.h>
#include <locale.h>

int main()
{
int i;
    
    printf("%c,%c,%c\n",c,c2,c3);

    setlocale(LC_CTYPE,"en_US.UTF-8");
    wchar_t* ws = L"中国人";

    char buf[255] = {};
    
    size_t len = wcstombs(buf,ws,255);
    
    printf("%ls\n",ws);
    printf("%d\n",len);

    for(i = 0; i<len; i++)
        printf("0x%02X ",(unsigned char)buf[i]);
    printf("\n");

    return 0;
}

输出:

中国人
9
0xE4 0xB8 0xAD 0xE5 0x9B 0xBD 0xE4 0xBA 0xBA 

使用python进行验证:

>>> astr="中国人"
>>> astr
'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'

和char字符串类似,wchar_t字符串以一个4字节的NULL结束。

#include <stdio.h>
#include <locale.h>

int main()
{
    int i;
    
    setlocale(LC_CTYPE,"en_US.UTF-8");
    wchar_t ws[] = L"中国人";

    printf("%ls\n",ws);

    printf("len=%d,size=%d\n",wcslen(ws),sizeof(ws));
    
    int len = sizeof(ws);
    unsigned char* b = (unsigned char*)ws;

    for(i = 0; i<len; i++)
        printf("0x%02X ",b[i]);
    printf("\n");

    return 0;
}

输出结果为:

中国人
len=3,size=16
0x2D 0x4E 0x00 0x00 0xFD 0x56 0x00 0x00 0xBA 0x4E 0x00 0x00 0x00 0x00 0x00 0x00 

编译器会自动连接相邻的字符串,便于在宏或者代码中更好地处理字符串。

对于源代码中超长的字符串,除了使用相邻字符串外,还可以用"\"在行尾换行,这个在很多语言都支持。

#include <stdio.h>
#define WORLD "world!"
int main()
{
    char* s = "Hello" " "WORLD"\n";

    char* s2 = "Hello"
        " World!\n";

    char* s3 = "Hello \
World!\n";
    printf("%s",s);
    printf("%s",s2);
    printf("%s",s3);
    return 0;
}

输出结果为:

Hello world!
Hello World!
Hello World!

 

 

posted @ 2013-11-12 21:01  小郭学路  阅读(354)  评论(0编辑  收藏  举报