一、操作符详解2
1整数在内存中的存储规则
我们的机器通常分为32位和64位机器,其所对应的就是在硬件设备中的“特殊的线的数量”
会使我们在计算整型等类型中影响其字节数量。大部分我们所使用的编译器都是使用32位模式的,所以我们以下介绍32位机器中整数的存储规则。
首先,用户输入一个数,这个数在内存中是以二进制补码的形式存储的。正数的原码,反码,补码都相同,负数的原码,反码,补码都不同。我们将详细介绍负数的原,反,补码
#include<stdio.h> int main() { int a = -5; //-5的原码 //10000000000000000000000000000101 -其中第一位是符号位 //11111111111111111111111111111010 - 符号位不变,其他位按位取反,得到-5的反码 //11111111111111111111111111111011 -反码加1得到-5的补码 return 0; }
2常见的操作符详解
(1)介绍按位或,与,异或的概念,并且利用异或操作符实现不创建新的变量达到交换两个数的值
数字在计算中是用其补码进行计算的
异或的概念,相同的为0,不同的为
按位与是有0为0,全1才为1
按位或是有1为1 ,全0为0
异或操作符实现不创建新的变量达到交换两个数的值
首先3和3异或为0,0和其他数异或,该数不变。所以,我们可以
#include<stdio.h> int main() { int a = 3; int b = 5; printf("交换前:a=%d b=%d\n", a, b); a = a ^ b; b = a ^ b;//a^b^b还是a a = a ^ b;//a^b^a=b; printf("交换后:a=%d b=%d\n", a, b); return 0; }
(2)强制类型转换
int a = (int) 3.14;括号应该扩到类型上,不是数字上;
(3)sizeof是求一种类型的字节长度,也是一种单目操作符
int main() { int a = 10; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof a); printf("%d\n", sizeof int);//注意int 的括号不能去掉 return 0; }
sizeof与数组的关系
#include<stdio.h> void test1(int arr[])//int arr[] 等价于int* arr指针 { printf("%d\n", sizeof(arr));//数组传参都是传进来数组的首地址 } void test2(int ch[])//int arr[] 等价于char* ch指针 { printf("%d\n", sizeof(ch));//数组传参都是传进来数组的首地址 } int main() { int arr[10] = { 0 }; char ch[10] = { 0 }; printf("%d\n", sizeof(arr));//40个字节 printf("%d\n", sizeof(ch));//10个字节 test1(arr);//4个字节 test2(ch);//char类型的指针同样是4个字节 return 0; }
3整型提升
比方说char a=5; char b=126; a+b=?
整型提升
int main() { char a = 5; //截断 //00000000000000000000000000000101 //00000101 char b = 126; //00000000000000000000000001111110 //01111110 //当a和b相加的时候,a和b都是char类型 // 表达式计算就要发生整型提升 // 00000000000000000000000000000101 // 00000000000000000000000001111110 // 00000000000000000000000010000011-c // 最高位即符号位,若其为1,则全补1;为0则全补0; // char c = a + b; // 10000011 - c //再发生一次整型提升 //11111111111111111111111110000011-c补码 //11111111111111111111111110000010-c的反码(补码-1) //10000000000000000000000001111101 - c的原码 printf("%d\n", c); return 0; }
4 关系操作符
>
>=
<
<=
!=(不等于)
==(判断是否相等)
5逻辑操作符
&&逻辑与-左操作数为假,右边不计算
|| 逻辑或-左操作数为真,右边不计算
360笔试题
#include<stdio.h> int main() { int i = 0, a = 0, b = 2, c = 3, d = 4; i = a++ && ++b && d++; //因为a本身为0,后置++,所以a++在表达式中值为0;为假,后面的操作均不执行,所以打印结果为 //a=1,b=2,c=3,d=4 printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d); return 0; }
二、字符串的倒置
例子:将 I like beijing.
逆序为 beijing like I
思:将空格作为分割,先将每一部分逆序为I ekil gnijieb
再将I ekil gnijieb 全部逆序,为beijing like I
补充:scanf读入以空格为分界,gets是以回车为分界
代码实现
倒置字符串
比如i like beijing.
变成beijing i like.
#include<string.h> #include<assert.h> //assert是断言,是确保char*指针不为空指针NULL void reverse(char* left, char* right) { assert(left && right); while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[100] = { 0 }; //输入 gets(arr); //逆置 int len = strlen(arr); //1 .逆置每个单词 char* start = arr; char* end = start; while (*end !='\0') { while (*end != ' ' && *end !='\0') { end++; } reverse(start, end - 1); if (*end == '\0') start = end; else start = end + 1; end = start; } //2.整个字符串的逆序 reverse(arr, arr + len - 1); //输出 printf("%s\n", arr); return 0; }