C语言类型和变量

C语言类型和变量
1.数据类型的介绍数据类型主要描述生活中的场景。类型相似的数据所拥有的共同特征编译器只有知道了数据的类型才知道怎么操作数据。使用整型类型来描述整数使用字符类型来描述字符使用浮点型类型来描述小数。货号 → 整数/字符串品名 → 字符串单位 → 字符串单价 → 小数数量 → 整数小计 → 小数字符型character在C语言中使用char来表示字符类型。整型integer在C语言中使用int表示整型类型。浮点型float 单精度浮点型double 双精度浮点型long double布尔类型c语言原来并没有为布尔值单独设置一个类型整数0表假非零值表真c99引入专门表示真假的布尔值。①布尔类型的使用得包含头文件stdbool.h②布尔类型变量的取值是 true或者false.sizeof各种数据类型的长度每一种数据类型都有自己的长度使用不同的数据类型能够创建出长度不同的变量变量长度的不同存储的数据范围就有所差异。sizeof是一个关键字也是操作符专门用来计算sizeof的操作数的类型长度单位是字节sizeof操作符的操作数可以是类型也可是变量或者表达式。sizeof 类型sizeof 表达式/变量名sizeof计算的结果想要打印的话用%zu来打印%zu属于占位符sizeof后边的表达式是不真实参与运算的根据表达式的类型来得出大小2.signed 和 unsignedsigned关键字有正负号的整数可以是正数、负数、0int类型默认带有正负号int等同于signed intchar 有无符号不确定unsigned关键字无符号整数只能是≥0的数只有非负数它们只影响一件事同一个二进制到底被解释成正数还是负数。二者范围不同使用场景不同。3.数据类型的取值范围每一种数据类型都有自己的取值范围也就是存储的数值的最大值和最小值的区间有了丰富的类型我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同的数据类型的极限值使用Everything搜索头文件limits.h文件说明了整型类型的取值范围。float.h文件说明了浮点型类型的取值范围。4.变量C语言中把经常变化的值称为变量不变的值称为常量。创建变量类型是用来创建变量的本质是在内存中开辟申请空间data_type name; //其中data_type是数据类型name是变量名int age;float weight 18;float score 55.5f; //为避免警报加f表明为float类型变量命名的规则①只能由字母包括大小写、数字、下划线_组成②不能以数字开头③长度不能超过63个字符④变量名中区分大小写//大写的_2B和小写的_2b是两个变量名⑤变量名不能使用关键字⑥变量名最好有意义 //例如age表示年龄weight表示体重变量在创建的时候就给一个初始的值就叫初始化int age 18;char ch w;double weight 48.0;unsigned int height 100;变量的分类全局变量局部变量只能所在{}内使用一般我们在编程时尽量使用局部变量可控。int num2 20 //全局变量——社会上的共享单车int main (){int num1 10; //局部变量——校园内的共享单车{int num3 100; //自己的自行车}return 0;}当全局变量和局部变量名字相同时局部变量优先使用。5.算数操作符C语言中为便利运算提供的一系列操作符运算符如下加 -减 *乘 /除 %求余 ——也叫做双目操作符因为它有左操作数右操作数两个。/可能会有的误解--除号int a 10;printf (%d\n,a/4); //打印出是2除号两端都是整数执行的是整数的除法printf (%d\n,a/4.0); //打印出是2.5若想得到小数至少有一边是浮点数return 0;double值放int中可能会丢失数据double的值要放到inta中可能会丢失数据我们加上一个*100看结果运算符%表示求模余运算即返回两个整数相除的余值这个运算符不能用于浮点数。printf(%d\n, 11%-5); //打印1printf(%d\n, -11%-5); //打印-1printf(%d\n, -11%5); //打印-1负数求模的规则是结果由第一个运算数的正负号决定。6.赋值操作符 和 复合赋值int a 10; //初始化a 10; //赋值a 46; //右边赋给左边连续赋值int a 3;int b 5;int c 0;c b a3; //连续赋值从右边向左依次赋值复合赋值int a 10;a a 3; //打印出是13a自增了3a 3; //与上一行同一个意思a 3 即 a a3a - 3 即 a a-3;a / 3 即 a a/3;a * 3 即 a a*3;a % 3 即 a a%3;7.单目操作符、--都有前置和后置之分aa1;a1;a; //先使用再加一a; //先加一再使用以上四种写法都是让a自增了1但前置后置还是有区别的int a 10;int b a; //若打印b值为11a先自增再赋值给biint b a; //若打印b值为10先把a的值赋给ba再自增前置后置的区别如何理解虽说赋值的优先级低于自增...能这么理解ba 就是 b(a1)ba 则是 ba然后aa18.强制类型转换万不得已 不用此处9.scanf 和 printf 介绍printf()的作用是将参数文本输出到屏幕。是在标准库的头文件stdio.h定义的使用此函数前必须在源码文件头部引入这个头文件。占位符//十进制%d —— int%hd —— short int%ld —— long int%lld —— long long int//无符号十进制%u —— unsigned int%hu —— unsigned short int%lu —— unsigned long int%llu —— lunsigned ong long int//八进制的占位符末尾字母是o十六进制则是x%p —— 指针用来打印地址%u —— 无符号整数%x —— 十六进制整数%zu —— size-t类型%% —— 输出一个百分号scanf()常用的占位符如下与printf()的占位符基本一致。%c —— 字符char%d —— 整数int%f —— float类型浮点数%lf —— double类型浮点数%s —— 字符串%[] —— 在[]中指定一组匹配的字符如%[0-9]遇到不在集合中的字符匹配将停止。printf输出格式1.限定宽度允许限定占位符的最小宽度printf(%5d\n,123); //输出为“ 123”上例%5d表示这个占位符的宽度至少为5位。若不满5位对应的值前会添加空格输出的值默认是右对齐的即输出内容前面会有空格如果希望改成左对齐在输出内容后面添加空格可以在占位符的%后插入一个负号-对于小数这个限定符会限制所有数字的最小显示宽度对于小数这个限定符会限制所有数字的最小显示宽度%f在打印小数的时候默认小数点后打印6位2.总是显示正负号默认情况下printf()不对正数显示正号只对负数显示负号。如果想让正数也输出正号可以在占位符的%后面加上一个3.限定小数位数默认是6位希望小数点后面只保留两位占位符可以写成%.2f,三位则是%.3f,会四舍五入4.输出部分字符串%s占位符用来输出字符串默认是全部输出。如果只想输出开头部分可以用%.[m]s指定输出的长度其中[m]表示一个数字表示所要输出的长度。printf(%.3s\n,abcdef);5.小补充printf()参数与占位符是一一对应关系如果有n个占位符printf()的参数就应该有n1个scanf1.局限性和解决办法scanf是c语言的库函数scanf_s是VS编译器自己提供的函数如果我们的代码中使用了scanf_s,那么你的代码在其他的编译器上编译不通过也就失去了跨平台的能力如果坚持使用scanf函数那么这样解决1.#define _CRT_SECURE_NO_WARNINGS这句代码放在使用scanf的这个文件的第一行注意中间有一个空格2.一劳永逸让每个.c文件都自动加上1.这句话.源文件的创建其实是拷贝了一个叫newcfile.cpp的文件那么在这个文件中加上这句话打开Everything这个软件搜索newcfile.cpp文件使用记事本的方式打开加上这句话后保存若无权限就将newcfile.cpp文件拷到桌面上再将桌面上的以记事本打开加句子保存后与其替换。2.基本用法scanf()函数用于读取用户的键盘输入程序运行到这个语句时会停下来等待用户从键盘输入用户输入数据按下回车键后scanf()就会处理用户的输入将其存入变量它的原型定义在头文件stdio.h语法与printf()相似scanf()处理数值占位符时会自动过滤空白字符包括空格制表符换行符等所以用户输入的数据之间有一个或多个空格不影响scanf()解读数据。另外用户使用回车键将输入分成几行也不影响解读。3.返回值scanf()的返回值是一个整数表示成功读取的变量个数如果没有读取任何项或者匹配失败则返回0如果在成功读取任何数列之前发生了读取错误或者遇到读取到文件结尾则返回常量EOF(-1)10.赋值忽略符*有时用户的输入可能不符合预定的格式只要把*加在任何占位符的百分号后面该占位符就不会返回值解析后将被丢弃在 scanf 的格式占位符里 % 后面加一个 * 比如 %*c 、 %*d 表示读取输入内容但不赋值给任何变量解析后直接丢弃。常用于跳过你不关心的分隔符、多余字符让代码能兼容多种输入格式11.关系操作符C语言用于比较正式的表达式称为“关系表达式”里面使用的运算符就称为“关系运算符”主要有以下6个 —— 大于 运算符 —— 小于 —— 大于等于 —— 小于等于 —— 相等! —— 不相等//关系表达式中通常返回1或0表示真假当一个变量和常量值比较相等的时候把常量放在的左边这是一个好习惯关系操作符不可连用int i 3;int j 8;int k 5;if(i j jk) // --并且不能写成ijk12.条件操作符也叫三目操作符表达式1 表达式2 表达式3exp1 exp2 exp3 //与if else语句相似某些场景可替代条件操作符的计算逻辑是:如果表达式1为真表达式2计算如果表达式为假表达式3计算。计算的结果是整个表达式的结果。13.逻辑操作符 、 || 、 !逻辑运算符提供逻辑判断功能用于构建更复杂的表达式。按位取反运算符 改变单个表达式的真假逻辑与运算符并且的意思两侧表达式同真则为真否则为假||逻辑或运算符或者的意思 两侧至少有一个为真则为真同假才假14.短路C语言逻辑运算符还有一个特点它总是先对左侧的表达式求值再对右边的表达式求值这个顺序是保证的。如果左边的表达式满足逻辑运算符的条件就不再对右边的表达式求值。这种情况称为“短路”。对于操作符左操作数结果是0时右操作数就不再执行。对于||操作符左操作数结果非0时就无需执行右操作数。像这种仅根据左操作数的结果就能知道整个表达式的结果不再对右操作数数进行计算的运算称为短路求值。下面这道题来理解这一概念int main() { int i 0, a 0, b 2, c 3, d 4; i (a b d); printf(a%d\nb%d\nc%d\nd%d\n, a, b, c, d); } 输出的值a,b,c,d各是多少当a1后又是多少