该部分只是用来记录c语言模糊的知识点
4、~ 按位取反
习题
*编写一个函数,用来输出整数在内存中的二进制形式
- 字符常量 char(字符常量单引号里面只能写入一个字符,而且不能是中文字符)
以下写法错误
char c = '123';
char c1 = '哦';
- sizeof
1.作用
用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。
2.基本形式
sizeof( 变量\常量 )
int size = sizeof(a);
sizeof 变量\常量
int size = sizeof a;
sizeof( 数据类型 )
intsize = sizeof(int);
不能是sizeof 数据类型
- 关系运算(比较运算)
关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级
低于后者:2==3>1
关系运算符的结合方向为“从左往右”: 4>3>2
关系运算符的优先级小于算术运算符:3+4>8-2
3 > 4 + 7 // 0
(3>4) + 7 // 7
5 != 4 + 2 * 7 > 3 == 10 // 0
字符串
3、^ 按位异或
- 在c语言中,字符串可以看成是一个字符数组,为了能和普通的字符数组区分开,要在字符串尾部添加结束标志’\0'
有三种初始化方法
char s[] = {'l','e','o','\0'};//字符串
char s1[4] = {'l','e','o','\0'};//字符串
char s3[] = "mj";//字符串会自动在尾部添加'\0',他的长度还是4
下面代码就会出现一些问题
char s2[4] = {'l','e'};//不是字符串,只是字符数组 第1、 2如果不添加结束标志,字符串就会有问题。 比如 在打印的时候
char s[] = {'l','e','o','\0'};
char s2[4] = {'l','e'}
printf("%s\n",s2);//因为没有结束标志,打印的时候 会输出leleo等乱七八糟的字符,就是因为在内存中
出现错误的原因
s2 | l |
e | |
S | l |
e | |
o | |
\0 |
- 字符串输出 c语言中有两种
printf("%s\n",s);
puts(s);//
两者区别
1 printf
可以输出多个,
puts
只能输出一个,
2puts()
自动换行
- 字符串输入
scanf()
//可以同时读取多个字符串,不能读取空格tab 存放完毕后,系统会在尾部加上一个结束标记\0
gets(s);//不安全的,一次只能读一个字符串,可以读取空格 、tab的字符串
存放完毕后,系统会在尾部加上一个结束标记\0
- 字符串数组
一维字符串数组可以存放一个字符串
二维字符串数组,可以存放多个字符串
- 字符处理函数
1、字符输出函数putchar (一次性只能输出一个字符)
putchar
(
65
);
//
直接在控制台输出
A
putchar('A');//直接在控制台输出A
2、字符输入函数getchar (一次性只能输出一个字符)
- 字符串处理函数
1、strlen函数(测量一个字符串的字符串长度,不包括结尾标识符’\0'不是测量字符数量 ,一个中文占3个字符串长度) 注意:char s1 ={‘m’,’j’};缺少结尾标示符\0,要经常注意这个问题
2、strcpy函数()将右边的字符串复制到到左边的字符串
3、strcat函数将右边的字符串添加到到左边的字符串 注意:要注意左边的长度要足够
4、strcmp函数比较左右两边字符串的长度
两个字符串从左至右逐个字符比较(按照ASKII码大小比较),直到字符不相同或者遇见’\0’为止。如果全部字符都相同,返回0.如果不相同,则返回两个字符串中的第一个不相同字符ASC码的差
5、strlwr函数所有字母小写
6、strupr函数所有字母大写
- 类型说明符(long short signed unsigned)
int 4字节
short 2字节
long 8字节
long long 8字节
long int a = 1000000000;
long a =100000000;//这两种写法都是一样的 long int =long
printf("%ld",b);//如果是long类型打印的时候输出操作符为%ld
long long c = 1000000000;
printf("%lld\n",c);
- 位运算
1、 & 按位与
对应的二进位都为1 结果才为1,否则结果为0
例如:5 & 3 结果为1
0 1 0 1 (5)
0 0 1 1 (3)
0 0 0 1 (1)
printf("%d\n",5&3);//最后输出1 ,说明计算正确
2、| 按位或
对应的二进位有一个为1就为1,否则为0
例如:5 | 3 结果为7
0 1 0 1 (5)
0 0 1 1 (3)
0 1 1 1 (7)
printf("%d\n",5|3);//最后输出7,说明计算正确
3、^ 按位异或
对应的二进位不相同就为1,否则为0
自己^自己 结果为0 比如8^8
交换 9^5^6 == 9^6^5
任何数值跟0进行异或,结果还是原来的数值 ,9^0=9
a^b^a = =b
例如:5 | 3 结果为7
0 1 0 1 (5)
0 0 1 1 (3)
0 1 1 0 (6)
对整数a的各二进位进行取反,符号位也取反(0变1,1变0)
5、<<左移
把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方
由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性
例如:9<<1 ->9*2 ==18
9<<2 -> 9*2*2 =36
9<<n ->9*2的n次方
6、<<右移
把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方
为正数时,符号位为0,最高位补0
为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定
习题
*在不用引入其他变量的情况下,使用位异或^运算符实现两个变量值的互换
int a=10;
int b=9;
a = a^b; //a=10^9
b = a^b; //b = 10^9^9=10
a = a^b; // a= 10^9^10 = 9
*使用位与&运算符变量的奇偶性
int a=15;// 15:1111
int b =14;//14:1110
//规律 :偶数最后一位肯定是0,奇数最后一位肯定是1
/**
15 :1111
1 0001
-----------
0001 =1
8 1000
1 0001
----------
0000 = 0
*/
if(a&1==0)
printf("偶数");
else printf("奇数");
*编写一个函数,用来输出整数在内存中的二进制形式
int main()
{
printBinary(3);
return 0;
}
void printBinary(int num)
{
int num=3;
int temp = (sizeof(num)<<3) - 1;//计算一下一共多少位,以防止编译器
for(int i=temp;i>=0;i--)
{
int temp = num>>i &1;
printf("%d",temp);
}
}