2.C语言数据类型和变量
1.数据类型介绍字符型char 1整型int 4短整型short int2 长整型long int8更长的整型long long int 8单精度浮点型float 4双精度浮点型double 8布尔类型_Bool 1专门表示真假的变量true非0false非01.1各种数据类型的长度首先要清楚一个字节type占8个比特位bit其次sizeof关键字可以计算类型或者表达式的长度其用法1 sizeof类型2 sizeof表达式sizeof后边的表达式是不参与真实运算的根据表达式的类型来得出来大小打印用%zd打印返回size_t数据类型的长度 vs2022x64环境中#include stdio.h int main() { short s 2; int b 10; printf(%d\n, sizeof(s b1)); printf(s %d\n, s); return 0; }sizeof中表达式不计算输出结果2 s2因为sizeof中表达式不计算所以s任然等于2。再看类型s为short类型占两个字节b为int类型占4个字节赋值过程中发生截断整个表达式的类型还是short所以输出22.signed和unsigned修饰字符型和整型的关键字signed表示有符号有正负号unsigned表示无符号只能表示正数和0整数变量声明为unsigned的好处是同样长度的内存能够表示的最大整数值增大了⼀倍1#defineSHRT_MIN (-32768)//有符号16位整型的最⼩值2#defineSHRT_MAX 32767//有符号16位整型的最⼤值3#defineUSHRT_MAX 0xffff//⽆符号16位整型的最⼤值4#defineINT_MIN (-2147483647 - 1)//有符号整型的最⼩值5#defineINT_MAX 2147483647//有符号整型的最⼤值6.signed charc;//范围为-128到1277.unsigned charc;//范围为0到2553.数据类型的取值范围limits.h⽂件中说明了整型类型的取值范围。float.h这个头⽂件中说明浮点型类型的取值范围。4.变量•全局变量在⼤括号外部定义的变量就是全局变量•局部变量在⼤括号内部定义的变量就是局部变量全局变量与局部变量名字相同局部优先1.局部变量是放在内存的栈区2.全局变量是放在内存的静态区3.堆区是⽤来动态内存管理的5.算术操作符、-、*、/、%双⽬操作符 - */ %/两个运算数必须⾄少有⼀个浮点数才会输出浮点数不然只会返回整数部分%求模只能用于整数负数求模的规则是结果的正负号由第⼀个运算数的正负号决定6.赋值操作符和复合赋值1 -2 * / %3 4 | ^7.单目操作符、--、、-前置先后使用后置先使用后8.强制类型转换1inta (int)3.14;//意思是将3.14强制类型转换为int类型这种强制类型转换只取整数部分9.scanf 和 printf 介绍9.1printf占位符列举printf()的占位符有许多种类与 C 语⾔的数据类型相对应。下⾯按照字⺟顺序列出常⽤的占位•%a ⼗六进制浮点数字⺟输出为⼩写。•%A ⼗六进制浮点数字⺟输出为⼤写。•%c字符。•%d⼗进制整数。// int•%e 使⽤科学计数法的浮点数指数部分的e为⼩写。•%E 使⽤科学计数法的浮点数指数部分的E为⼤写。•%i 整数基本等同于%d。•%f⼩数包含float类型和double类型。//float %f double - %lf•%g 6个有效数字的浮点数。整数部分⼀旦超过6位就会⾃动转为科学计数法指数部分的e 为⼩写。•%G 等同于%g唯⼀的区别是指数部分的E为⼤写。•%hd⼗进制 short int 类型。•%ho ⼋进制 short int 类型。•%hx ⼗六进制 short int 类型。•%huunsigned short int 类型。•%ld⼗进制 long int 类型。•%lo ⼋进制 long int 类型。•%lx ⼗六进制 long int 类型。•%luunsigned long int 类型。•%lld ⼗进制 long long int 类型。•%llo ⼋进制 long long int 类型。•%llx ⼗六进制 long long int 类型。•%llu unsigned long long int 类型。•%Le 科学计数法表⽰的 long double 类型浮点数。•%Lflong double 类型浮点数。•%n 已输出的字符串数量。该占位符本⾝不输出只将值存储在指定变量之中。•%o ⼋进制整数。•%p指针⽤来打印地址。•%s字符串。•%u⽆符号整数unsigned int。•%x⼗六进制整数。•%zdsize_t类型。•%% 输出⼀个百分号。printf可以限定占位符的最小宽度不够的用空格补齐printf(%5d\n, 123); // 输出为 123左右对齐前面加-号是左对齐printf(%-5d\n, 123); // 输出为 123 限定小数位%.nfprintf(%-5d\n, 123); // 输出为 123 可以与限定宽度占位符结合使⽤printf(%6.2f\n, 0.5);//小数点也算一位最⼩宽度和⼩数位数这两个限定值都可以⽤*代替通过printf()的参数传⼊。printf(%*.*f\n, 6, 2, 0.5);// 等同于printf(%6.2f\n, 0.5);输出部分字符串%.[m]sprintf(%.5s\n, hello world);// 输出 helloprintf()参数与占位符是⼀⼀对应关系如果有n个占位符printf()的参数就应该有n 1 个参数参数参数。如果参数个数少于对应的占位符printf()可能会输出内存中的任意值。9.2 scanf1 #include stdio.h 2 3 int main() 4 { 5 int score 0; 6 printf(请输⼊成绩:); 7 scanf(%d, score); 8 printf(成绩是%d\n, score); 9 return 0; 10 }注标准输⼊⼀般指的就是键盘标准输出⼀般指的就是屏幕基本⽤法1scanf(%d, i);scanf()函数⽤于读取⽤⼾的键盘输⼊。程序运⾏到这个语句时会停下来等待⽤⼾从键盘输⼊。⽤⼾输⼊数据、按下回⻋键后scanf()就会处理⽤⼾的输⼊将其存⼊变量。scanf()处理数值占位符时会⾃动过滤空⽩字符包括空格、制表符、换⾏符等scanf() 解读会从上⼀次解读遗留的第⼀个字符开始直到读完缓存或者遇到第⼀个不符合条件的字符为⽌。#include stdio.h int main() { int x; float y; // ⽤⼾输⼊ -13.45e12# 0 scanf(%d, x); printf(%d\n, x); scanf(%f, y); printf(%f\n, y); return 0; }x读到-13y读到.45e120.45x10的12次方读完停到#scanf()的返回值是⼀个整数表⽰成功读取的变量个数如果没有读取任何项或者匹配失败则返回0如果在成功读取任何数据之前发⽣了读取错误或者遇到读取到⽂件结尾则返回常量 EOF (-1)按ctrlz提前结束输茹除了%c以外都会⾃动忽略起⾸的空⽩字符%c 不忽略空⽩字符总是返回当前第⼀个字符⽆论该字符是否为空格。强制跳过字符前的空⽩字符scanf( %c, ch) 即%c前加上⼀个空格1.不能读取带空格的句子如果你输入 Hello Worldscanf(%s, ...)只会读取 Hello并在 o 后面加 ‘\0’World 会被留在输入缓冲区里。2.数组越界风险如果你定义的数组太小比如char str[2]但你输入了 Helloscanf会强行写入 H, e, l, l, o,\0。这会超出数组界限覆盖掉旁边内存的数据导致程序崩溃赋值忽略符*忽略不符合预定的格式#include stdio.h int main() { int year 0; int month 0; int day 0; scanf(%d-%d-%d, year, month, day); printf(%d %d %d\n, year, month, day); return 0; }输入2026/7/11程序报错如果改成scanf(%d%*c%d%*c%d, year, month, day);则自动忽略/输出2026 7 11