开发环境
需要一个IDE,这里笔者选择Visual Studio Code,windows需要安装gcc(编译器),然后配置环境参考https://zhuanlan.zhihu.com/p/335707213
数据类型
-
偏底层的语言是强数据类型的,就是严格区分数据类型并且会对其进行检查,比如C,C++,JAVA.上层语言不关注数据类型,他只要知道这是一个数,并不用关心数的范围大小和类型,如python.
-
整数
char,short,int,long,longlong(c99)
-
浮点数
float,double,longdouble(c99)
-
逻辑
bool(c99)
-
指针
-
自定义类型
int a;
printf("sizeof(int)=%ld\n",sizeof(int)); //sizeof()可以显示一个变量的大小
- int是用来表示计算机字长的单位,与计算机的字长和编译器有关,可能会随着电脑编译器版本的不同而不同。
printf("sizeof(char)=%ld\n",sizeof(char));
printf("sizeof(short)=%ld\n",sizeof(short));
printf("sizeof(int)=%ld\n",sizeof(int));
printf("sizeof(long)=%ld\n",sizeof(long));
printf("sizeof(long long)=%ld\n",sizeof(long long));
printf("sizeof(float)=%ld\n",sizeof(float));
printf("sizeof(double)=%ld\n",sizeof(double));
输出结果
sizeof(char)=1
sizeof(short)=2
sizeof(int)=4
sizeof(long)=4
sizeof(long long)=8
sizeof(float)=4
sizeof(double)=8
1表示一个字节
-
补码 在计算机中表示负数的二进制,因为-1 + 1=0补码的作用是将减法变成加法,所以在设定补码和原码相加为一个溢出的0 如1 原码 0000 0001 补码 1111 1111 这样相加就是1 0000 0000
-
整数的范围
char 1个字节的整数范围 (-128~127) 8个字节共能表示256个数,1111 1111 表示负数 -128
short 两个字节(-32768~32767)
1111 1111~ 1000 0000当类型为char,当作整数看待时他就是负数,而且是补码形式,1111 1111是-1的补码,所以他表示整数-1,1000 0000表示整数-128
char a = 255;
char b = 0b11111111;
short c = 255;
printf("%d,%d,%d\n",a,b,c);
输出:
-1,-1,255
3个数都是1111 1111 在1个字节的类型眼里,因为最高位就是第8位,所以是个负数,被看成是补码,在16个bit的short眼里,最高位是0,是个整数所以值不变,溢出的值是会出错的
unsigned char a =255; \\将最高位不看作符号位,扩大了正数的范围,也有利于做移位
-
整数的输出
比 int 小的类型 “%d”
比 int 大的类型 “%ld”
unsigned “%u”
-
浮点数
- 科学记数法,小数
double ff = 1E-10; printf("%E,%.16f\n",ff,ff);
%e表示用科学计数法输出,f是浮点数输出,浮点数可以表示小数点后10个0加1,但是printf如果不去指定小数点后显示的个数一般显示不到第十位,所以要用 %.16指定显示到小数点后第十六位,指定位数的输出是四舍五入的。
inf,超过范围的浮点数,±∞
nan 不存在的浮点数
浮点数是不精确的。
float a,b,c; a = 1.345f; //小数默认是double,要定义float类型就在后面加f b = 1.123f; c = a + b; if (c == 2.468) printf("相等\n"); else printf("不想等! c=%.10f, 或%f\n"c,c);
程序输出是 不相等! c=2.4679999352 或 2.468000
这就说明浮点数相加产生的不是精确的值,所以判断两个浮点数相等不能用
if (a == b);\\错误 if (fabs(a - b) < 1e-12); \\a-b小于1的负12次方
所以在计算小数的时候不要用浮点数,将小数乘以10的若干倍变为整数再用整数计算
-
字符
char可以表示一个字节的整数也可以表示一个字符,字符用单引号。
如 char c = ‘1’;等效于 char c = 49;
c作为字符可以是他的字符’1’,做整数输入输出的时候就是他的ASCII码值 -
逃逸字符
字符 意义 字符 意义 \b 回退一格 " 双引号本身 \t 到下一个表格位 ’ 单引号 \n 换行 \ 反斜杠本身
表格位的作用就是对齐不同长度的输出,如
printf("123\t456\n");
printf("1234\t456\n");
第一行46和第二行456会对齐。
-
类型转换
当运算符两边出现不一致的类型时,会自动转换成范围较大的类型。
对于print,任何小于int的类型会被转换成int,folat的被转换成double,但是scanf不会
强制类型转换:通常是转换为小的类型
(int)10.2;
(short)32;强制转换成小类型可能会出现溢出错误。它只是去生成一个新类型的变量,并不会改变原来的变量,如
int i=32768; s = (short)i;
i本身还是32768,只是s变为-1,因为溢出了。
强制类型转换的优先级高于四则运算。
-
逻辑运算
!a 逻辑非 &&逻辑与 ||逻辑或 逻辑运算只有1和0作运算,逻辑与就是只有1与1为1
如: x > 4 && x < 6; 表示x属于(4,6);
优先级
优先级 运算符 结合性 1 () 从左到右 2 ! + - ++ – 从右到左 3 * / % 从左到右 4 + - 从左到右 5 < <= > >= 从左到右 6 == != 从左到右 7 && (逻辑运算倒数第二) 从左到右 8 || 从左到右 9 = += -= *= /= (赋值最低) 从右到左 短路
逻辑运算自左向右, &&如果左边是flase,就不会计算右边,如果 || 左边是ture就不会计算右边。当 a == 6 && b +=1; 时如果左边为flase,右边就不会只加。
逗号
逗号的优先级比所有的都弱,只比赋值高,主要用于for循环中
i = 1+2,3+4; \\由于逗号的优先级低于+,所以i=3,而3+4没有变量可以赋值 i = (1+2,3+4); \\作为一整个表达式,括号里有逗号值为最右边,i=7 for (i=1,j=2;i<j;i++,j--) \\主要用于for void function(int a,int b); \\表示传入两个参数 void function(int(a,b)); \\传入一个参数,逗号是运算符,真正的值是右边,b