笔试题
//求输出结果
int main()
{
char a[1000];
int i;
for(i = 0; i<1000;i++)
{
a[i] = -1 – i;
}
printf(“%d\n”,strlen(a)) ;
return 0;
}
//a[i]为char型数据,取值范围: -128 ~ +127
//所以:经过128次循环后 a[127] = -128,再次循环此时(-128 - 1) = +127即 a[128]=127。再循环到a[255]=0;(0对应ASCII码的'\0')。
//strlen()的机制是计算到第一个'\0'之前的长度,所以输出255。
//会做这个题目,需要对C语言的数据类型有很深的理解
字符型常量:
C语言的字符常量是用单撇号括起来的一个字符。如’a’、’x’、’D‘、’?’、‘$’等都是字符常量。
除了以上形式的字符常量外,C还允许用一种特殊形式的字符常量,就是以一个字符“\”开头的字符序列。
转义字符及其作用:
//例:
#include <stdio.h>
int main()
{
printf("123456780123456\n");
printf("1234567\b12\n");
printf("1234567\r00\n");
printf("1234567\t12\n");
printf("123456781\t12\n");
printf("\141\n");
printf("\x3f\n");
return 0;
}
//输出:
123456780123456
12345612 //结论:7输出后输出1,1要退一格把7覆盖
0034567 //结论:光标移到本行开头,输入后面内容,覆盖原先内容
1234567 12 //结论:一个水平制表符占8列
123456781 12
a //八进制141即为97对应ASCLL码表a
? //十六进制3f即为63对应ASCLL码表?
//例:
int main()
{
printf("12345678901234567890\n");
printf(" ab c\t de\rf\tg\n");
printf("h\ti\b\bj k");
return 0;
}
//结果:
12345678901234567890
fab c gde
h j k
字符型变量:
字符变量的定义形式如下:
char c1, c2;
c1=‘a’; c2=‘b’;
在所有的编译系统中都规定以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。
字符数据在内存中的存储形式及其使用方法 :
将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。
例如字符’a’的ASCII代码为十进制数97,’b’的ASCII代码为十进制数98。
在内存中字符数据以ASCII码存储,它的存储形式就与整数的存储形式类似。这样使字符型数据和整型数据之间可以通用。
一个字符数据既可以以字符形式输出,也可以以整数形式输出。
以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。
以整数形式输出时,直接将ASCII码作为整数输出。
也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。
//向字符变量赋予整数
#include <stdio.h>
void main()
{
char c1, c2;
c1=97;
c2=98;
printf("%c %c\n", c1, c2);
printf("%d %d\n", c1, c2);
}
//输出结果:
a b
97 98
//大小写字母的转换
#include <stdio.h>
void main()
{
char c1, c2;
c1='a';
c2='b';
c1=c1-32;
c2=c2-32;
printf("%c %c", c1, c2);
}
//小写字母和大写字母之间差:32
//输出结果:A B
#include <stdio.h>
void main()
{
printf("%c\n", 'A' - 32);
printf("%c\n", 'A' * 32);
printf("%d\n", 'A' * 32);
}
//结果:
!
//空,没有响应的字符对应
2080
字符数据是有符号整数还是无符号整数?
有没有符号要结合开发平台。
在嵌入式开发中,考虑到代码的移植性,对于有符号(signed)与无符号(unsigned)一定要留心系统默认的是无符号还是有符号;
为了解决此问题,通常使用typedef来重新指定声明无符号还是有符号;
Typedef int sig_int;
Typedef unsigned int un_int;