字符串、转义字符、操作符几个注意事项
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位系统下的二进制为:
0 | 0000 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;
}