C语言拾遗
前言:实际上我觉得这些几乎都不重要,但是发现有些记忆迷糊了,权且记录一下.
- ASCLL码中: A 65 a 97
- getchar() putchar()
EOF = end of file = -1)
这两者可以这样搭配使用:
int c;//由于char类型并不知道是unsigned还是signed,因此用int
while((c=getchar())!=EOF)
{
putchar(c);
}
- %5d: 是右对齐,至少打印5位,如果不够5位就会在左边用空格补齐.
-5d是左对齐,会在右边加上空格.
- scanf的返回值是一个整数,表示成功读取的变量个数.
因此如果返回0,那么就意味着读取到0个变量;返回-1,则意味着发生错误或者读到结尾(这时-1就是EOF)
- printf的返回值为打印的总字符个数.
- goto语句和label必须处在同一个函数里.
- 生成0-99随机数:
srand(time(0));
int num = rand()%100;
- 引用另一个源文件的全局变量:
extern int a;
static int a = 0;修饰局部变量会使得变量不会反复创建;修饰全局变量会使得其为内部链接.
- VS2022调试:
- 逐过程:F10
- 逐语句:F11
- 监视数字内容:arr,10
- 二维数组:arr,2,3
- 负数的补码和原码的转化都是非符号位取反,然后+1
- a^a = 0,由此得出单身狗算法:一个数组中每个数字都出现两次,但有一个只出现一次.寻找这个数字只需要全部异或一遍
- 交换的两种:
a = a+b;//可能会越界
b = a-b;
a = a-b;
a = a^b;
b = a^b;
a = a^b;//当a==b的时候,上述过程就坏了,且只能用于整数.速度也慢
- 消去n最右边的1: n = n&(n-1) 或者写成
n &= n-1
每次应用,可以得到:1101 -> 1100 ->1000