【C】Re03
一、变量
变量存储了两个东西:
1、内存空间地址
2、内存空间存放的值
本质是给内存地址起了一个别名,允许我们通过别名对内存进行访问
void variable01() { int a = 100; printf("a -> %d\n", a); } int main() { variable01(); return EXIT_SUCCESS; }
1、不进行赋值调用问题
void variable02UseWithoutAssign() { int a; printf("a -> %d\n", a); } int main() { variable02UseWithoutAssign(); return EXIT_SUCCESS; }
CLion允许程序正常执行,编辑区域会显示淡黄警告提示
如果是VS则不允许程序执行,没有赋值的变量不允许使用
如果声明的这个变量不知道应该赋值多少,就和CLion一样默认赋值0
2、变量声明前后问题
C允许变量可以在调用的函数之后赋值,语法:
void variable03EarlyUse() { extern int sss; printf("sss been early use with extern keywords -> %d\n", sss); } int sss = 1000; int main() { variable03EarlyUse(); return EXIT_SUCCESS; }
在写的时候发现,即使extern不声明int 数据类型,也是可以执行的,但是编译器输出有看到错误提示:
warning: type defaults to 'int' in declaration of 'ssss' [-Wimplicit-int]
extern关键字的作用
告诉编译器这个变量的定义在后面,如果提前使用了,引导程序先找到变量的定义
再回到函数中继续执行下一行,如果寻找的变量不存在。程序终止
error: 'sss' undeclared (first use in this function); did you mean 'ssss'?
但是请不要这样使用,程序的可读性很差,书写混乱
二、常量
在程序运行中不可发生改变的值
但是C语言的常量存在五种形式:
1、字面值数值常量:
我们命名的变量在进行赋值时所使用的字符数值
除了整数100或者20这样的,同时实数也算常量,实数就是小数
2、字面值字符常量
字母,转义字符,都时字符常量
3、字符串常量
和字符常量一致,除了单引号和双引号的区别
4、符号常量
宏常量的定义
5、Consti定义
const int aa = 22200;
三、关键字 & 标识符
C程序预先对一些关键字做出了程序的预定义
参考知乎
https://zhuanlan.zhihu.com/p/77474834
四、数据类型
void dataType() { short varA = 100; // 32768 int varB = 100; long varC = 100; long long varD = 100; printf("short -> %hd\n", varA); printf("int -> %d\n", varB); printf("long -> %ld\n", varC); printf("long -> %lld\n", varD); }
1、有符号与无符号整型区别?
void signedAndUnsigned() { signed short varA = 327680; unsigned short varB = 327680; printf("varA -> %d\n", varA); printf("varB -> %d\n", varB); } int main() { signedAndUnsigned(); return EXIT_SUCCESS; }
五、SizeOf使用
可以直接对数据类型获取字节占用数
void sizeofUsage() { // sizeof 用来查看数据类型占用的字节大小 printf("dataType int size is -> %llu\n", sizeof(int)); printf("dataType short size is -> %llu\n", sizeof(short)); printf("dataType long size is -> %llu\n", sizeof(long)); printf("dataType long long size is -> %llu\n", sizeof(long long)); printf("dataType float size is -> %llu\n", sizeof(float)); printf("dataType double size is -> %llu\n", sizeof(double)); } int main() { sizeofUsage(); return EXIT_SUCCESS; }
sizeof 也可以是一个变量来获取
int s = 2222; printf("%d", sizeof(s));
六、Char字符型
void charDataType() { char newLine = '\n'; char oneCharacter = 'a'; printf("ch -> %c \n", oneCharacter); printf("newLine -> %d \n", newLine); // 以整型查看会被强转输出 } int main() { charDataType(); return EXIT_SUCCESS; }
大小写转换:
void lowerAndUpperTransform() { char ch = 'e'; printf("this character char -> %c but int -> %d\n", ch, ch); // int n = (int) ch; ch = ch - 32; printf("after change, char -> %c but int -> %d\n", ch, ch); } int main() { lowerAndUpperTransform(); return EXIT_SUCCESS; }
七、浮点型
void floatDataType() { printf("%d\n", sizeof(3.14)); printf("%d\n", sizeof(3.14f)); } int main() { floatDataType(); return EXIT_SUCCESS; }
格式化输出的一些操作:
void floatDataType() {double aa = 12.123456789; printf("%f\n", aa); // 单精度 %f printf("%lf\n", aa); // 双精度 %lf printf("%.2f\n", aa); // 单精度 %f 指定小数保留位,并具有四舍五入 printf("%.4f\n", aa); // 双精度 %lf 指定小数保留位 } int main() { floatDataType(); return EXIT_SUCCESS; }
八、字符串类型
void stringDataType() { printf("string -> %s\n", "Hello String"); printf("string -> %d\n", sizeof("Hello String")); // 拆分单个字符进行字节占用计算 // 虽然字符只有12个,但是实际上还有一个\0的标志 \0表示这个字符串的结束 printf("string -> %s\n", "Hello\0String"); // 从这里输入\0将只保留Hello后续的字符串不计入了 } int main() { stringDataType(); return EXIT_SUCCESS; }
字符串变量:
void stringDataType2() { // 字符串,就是字符组成的数组 (Strings) char str[] = "Strings"; printf("(%s)\n", str); // 等同于这样的数组,但是单独打印输出会发现多出这么一个东西 (Strings ) char str3[] = {'S','t','r','i','n','g','s'}; // 现在的合并打印会一起看到这个:(StringsStrings) printf("(%s)\n", str3); } int main() { stringDataType2(); return EXIT_SUCCESS; }
九、SCANF 输入:
void scan01() { int num = 0; printf("num mem-addr -> %x\nnum value -> %d\n", &num, num); printf("Input Tips: balabala..."); // 第二参数需要注入一个变量的地址,变量存储了值和地址,但是要获取地址的话,使用&前缀实现 scanf("%d", &num); printf("num mem-addr -> %x\nnum value -> %d\n", &num, num); }