1 编译型和解释型语言的区别
a执行效率
b平台无关性
2 gcc -E/-S/-C/-O 参数的意义
gcc -E 预处理:进行预处理
gcc -S 编译:将代码翻译成汇编语言
gcc -C 汇编:将汇编文件转换为二进制目标代码
gcc -O 链接:生成可执行文件
***
3 求余与除法
-7/3 = -2 因为-2*3 = -6。 -6+(-1) = -7。因此取余为-1
同理可知7%-3 = 1。
可总结出取余的正负与被除数相同
-7/3=-2 -7%3=-1
7/-3=-2 7%-3=1
4 不用第三方变量进行数据交换
方法一:
#include<stdio.h>
int mian()
{
int a = 10, b = 5;
a = a + b;
b = a - b;
a = a - b;
printf("a = %d b = %d",a,b);
return 0;
}
方法二:
#include<stdio.h>
int mian()
{
int a = 10, b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d b = %d",a,b);
return 0;
}
5补码。。查看书籍《编码》
个人理解:
首先要理解一个原则,数据定义后如果不去修改它的话,其在内存中是以补码的形式存在的,并且该补码数值不会更改。unsigned int a = -1
一旦声明 -1 就以 int 型的形式将-1 的补码存储在内存中,而内存中这个值是不变的, 就看编译器如何去解读。比如,此次我们都将 -1 的补 码以unsigned int类型去解释。我们知道int 型的 -1 在内存中是以补码存储的,其补码为
1111 1111 1111 1111 1111 1111 1111 1111
如果我们以int去解释这个补码的话,该补码对应的int 值就是 -1
如果我们以unsigned int 去解释这个补码的话,该补码对应的就不是 -1了,而是二进制的 1111 1111 1111 1111 1111 1111 1111 1111 这将是很大的一个数。
因此printf("a = %u\n",a);
将输出4294967295,即上面的二进制转换为十进制的值
当执行printf("a + b = %d\n",a+b);
时,a + b
不同类型的数据要进行运算时,会进行隐式转换,将 a 隐式转换成 int 型,即以int型去解释a,此时 a 的值即为-2。故 a + b = -2 +2 =0。因此,输出为0
#include <stdio.h>
int main(int argc, char *argv[])
{
unsigned int a =-1;
int b = 1;
printf("a = %u\n",a);
printf("b = %u\n",b);
printf("a + b = %d\n",a+b);
return 0;
}
下面这条语句将输出129.因为-127在计算机中是以补码 1000 0001形式存储的。将它强制转换为unsigned char,则其对应的值为129.因此%d输出为129
printf("%d\n",(unsigned char)(-127));
下面这两条语句输出结果都是4294967295
printf("%u\n",(unsigned int)(-1));
printf("%u\n",-1);
下面这两条语句都输出-1,格式化输出 ,
后面表示该数据类型是什么,要从该数据的其实指针去读多少个字节。而格式化输出%d或%u等表示以什么样的形式去解读这些字节。
printf("%d\n",(unsigned int)(-1));
printf("%d\n",-1);
下面这条语句的输出为
-129
4294967167
#include<stdio.h>
int main()
{
int a = -129;
printf("%d\n",(unsigned int )(a));
printf("%u\n",a);
}
6转义字符
printf("\\= %d \\ = %d",'\\','\\');//输出 \= 92 \ = 92
printf("\"= %d \" = %d",'"','\"');//输出 "= 34 " = 34