Bootstrap

C语言字符串、转义字符、操作符

字符串、转义字符、操作符几个注意事项

1.字符串

字符串的结束标志:\0

求字符串的长度:使用strlen函数

在arr2数组中再加个’\0’字符,就能正确打印出abc

char arr1[] = "abc";			//内存存放形式:abc\0
char arr2[] = {'a','b','c'};	//内存存放形式:abc?????????

//打印字符串
printf("%s\n",arr1);		//abc
printf("%s\n",arr2);		//abc烫烫烫烫烫烫b

//求字符串长度
printf("%d\n",strlen(arr1));		//3
printf("%d\n",strlen(arr2));		//随机值

注︰字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算作字符串内容。

2.转义字符

\ddd ddd表示1~3个八进制的数字。如:\130 X
\xdd dd表示2个十六进制数字。如: \30 0

printf("%c\n",'\130');	//8进制的130是十进制的88,按%c的形式打印就是字符X
printf("%c\n",'\101');	//8进制的101是十进制的65,按%c的形式打印就是字符A
printf("%c\n",'\x30');	//16进制的30是十进制的48,按%c的形式打印就是字符0

‘\130’ -> 1 * 82+3 * 81 = 88

‘\101’ -> 1 * 82+1 * 80 = 65

‘\x30’ -> 3 * 161 = 48

printf("%d \n", strlen("c: \test\328\test.c"));		//14

这个字符串的长度是14,因为\t是一个字符,\32是一个字符,因为八进制数中没有8,所以字符8不能算进转义字符里

注释有两种风格:

C语言风格的注释 /* xxxxxx */ 缺陷:不能嵌套注释

C++风格的注释 //xxxxxxxx 可以注释一行也可以注释多行

3.操作符

sizeof是一个操作符,不是函数

作用:计算类型或者变量的大小的

int main()
{
	int a = 10;
	printf("%d \n", sizeof(int));	//可以直接求类型大小,结果为4
	printf("%d \n", sizeof(a));		//也可以求变量的大小,结果为4
	return 0;
}

计算数组大小方法:

int main()
{
	int arr[10] = {0};
	printf("%d\n",sizeof(arr));		//计算的是数组的总大小,单位是字节,结果为40
	printf("%d\n",sizeof(arr[0]));	//数组的第一个元素的大小,结果为4
	int sz = sizeof(arr)/sizeof(arr[0]);	//数组中的字节大小除以一个元素的大小,就是数组元素的个数,结果为10
	printf("%d\n",sz);
    return 0;
}

按位取反~

int main (){
{
	int a = 0;
	printf ( "%d \n", ~a) ;		//结果是-1
}

解释:

因为a为0,所以其在32位系统下的二进制为:

00000 0000 0000 0000 0000 0000 0000 0000
~a:1111 1111 1111 1111 1111 1111 1111 1111

因为整数在内存中存储的是补码

所以,取反后a在内存中的存储是全1,而%d输出要转为原码,由补码->反码->原码,结果得到-1,所以负数在内存中存储和输出会经过二进制计算转化

1111 1111 1111 1111 1111 1111 1111 1111(补码)

​ ↓

1111 1111 1111 1111 1111 1111 1111 1110(反码)

​ ↓

1000 0000 0000 0000 0000 0000 0000 0001(原码)

所以结果输出为:-1

正整数:原码、反码、补码相同

负数:在内存中是以补码形式保存的,补码等于反码加一

逗号操作符

逗号表达式,是从左向右依次计算的

整个表达式的结果是最后一个表达式的结果

int main()
{
	int a = 0;int b = 3;int c = 5;
	int d = (a = b + 2,c = a - 4, b = c + 2);	// a=3+2=5,		c=5-4=1,	b=1+2=3		最终d = b = 3
	printf ("%d \n", d);			//结果是3
}

示例代码:

a = get_val();
count_val(a);
while (a > 0)
{
    //业务处理
    a = get_val();
    count_val(a);
}

如果使用逗号表达式,改写后可减少冗余:

while (a = get_va1(),count_val(a), a>0)
{
		//业务处理
}
下标引用操作符[ ]

访问数组下标时用的[ ]叫做下标引用操作符

printf ("%d \n", arr[4] );	//[]的操作数是2个:arr , 4
小括号():函数调用操作符

如 fun(a,b)

操作数有三个,fun,a,b,有些函数没有参数,那就一个操作数,就是函数名

结构成员访问操作符 . ->

.

使用:

struct B
{
    char name[10];
    char id[10];
    int price;
};

int main()
{
    Struct B b;
    printf("书名:%s \n", b.name);
    printf("书号:%s \n", b.id);
    printf("定价: %d\n", b.price);
    return 0;
}

->用于指针形式

struct B
{
    char name[10];
    char id[10];
    int price;
};

int main()
{
    struct Book b = { "c语言","C20210509",55};
    struct Book * pb = &b;
    printf("书名:%s \n",(*pb).name);
    printf("书号:%s \n",(*pb) .id) ;
    printf("定价:%d \n", (*pb) .price);
	//等价于下面写法,一般使用下面的写法,结构体指针->成员名
    printf("书名:%s \n",pb->name);
    printf("书号:%s \n",pb->id) ;
    printf("定价:%d \n", pb->price);
    return 0;
}
;