C学习笔记 知识集锦(一)
1.标识符 2.寄存器变量 3.全局变量 4.分配内存与初始化 5.变量定义与声明 6.作用域规则 跳转语句 7.&与&&,|和||的意义与区别 8.如何选择switch case和if else语句
9.字符问题 10.printf输出格式 11.|和% 求余与求商 12.转义字符 13.函数地址 14.溢出以及短路求值 15.有符号数和无符号数的比较
标识符
标识符由字母数字下划线组成,其中必须以字母或下划线开头,标识符的长度没有限制,但是对大小写字母很敏感,用户自定义的标识符中不能连续出现两个下划线,也不能以下划线紧连大写字母开头,
此外定义在函数体外的标识符不能以下划线开头,标识符分为关键字,预定义标识符,用户标识符,关键字不可作为用户标识符,main,define,scanf,printf等都不是关键字
所谓参数标识符即是变量名,在函数声明时是可选的,在定义时是必要的
寄存器变量
变量一般为局部变量,不能为全局变量或静态变量,因为寄存器变量属于动态存储方式,区别于静态,数据区有全局数据区(静态数据区),堆区,栈区,文字常量区,程序代码区
全局变量
生命周期与作用域:生命周期是整个程序结束,因为其存储在全局变量区(静态数据区),在程序开始的时候即被初始化直到程序结束;一个全局变量如果没有被static修饰,那么可以在
其他源文件中用extern声明,那么其作用域即可延伸到其他地方
分配内存与初始化
分配内存:即可以算是创建了该变量,初始化操作是让它拥有一个有意义的值
静态变量:和全局变量一样在进入main函数之前就已经分配内存(即是在编译期间分配的内存)
普通变量:即auto变量,创建并分配内存即是程序第一次运行到此处的时候
初始化:是让它拥有一个有意义的值
C要求在程序块的起始处定义所有的变量,以便在编译器创建一个块时,能给所有这些变量分配空间
静态变量:是在第一次调用该变量所在函数的时候
普通变量:程序第一次运行到这里即会分配内存并初始化
变量定义与声明
定义:变量在定义时被分配内存,并且可以指定一个初始化的值
int *x,y; //定义指针x,int型变量y,因为*标识符结合而不是与类型结合,所以建议尽量一行定义一个指针以免出错
int x = y = 10; //错误的,定义时不可连续赋值,定义完成后可以连续赋值
声明:声明如extern int a; //这只是声明,不会分配内存
作用域规则
变量在哪里创建,既将在哪里销毁
局部变量:局部变量的作用域由变量所在的最近一对括号确定,因此在一个函数中可以定义多个重名但作用域不同的局部变量
注意若是在switch case 语句中定义局部变量则需注意在一个case中定义初始化一个变量后会不会有跳过这个case的初始化而直接在其他case中使用的情况,使用一个未初始化的变量是有问题的
全局变量:最好在cpp中定义,在头文件中定义时假如头文件被包含也许会出现未知的问题
跳转语句
中断当前的执行过程,C++提供了四种跳转语句 break,continue,goto,return;
break:负责终止离它最近的while,do while,for,switch语句,并从这些语句之后的第一条语句开始继续执行,即break之后的语句得不到执行,
break语句只能出现在迭代语句或switch语句的内部,break语句的作用范围仅限于最近的循环或者switch
continue:终止最近的循环中的当前迭代并立即开始下一轮迭代,对于while和do while来说是继续判断条件的值,对于for来说,是继续执行for循环中的expression,即为跳出本次循环,
continue之后的语句也得不到执行,continue语句只能出现在for,while,do while等循环的内部,或者嵌套在此类循环的语句或块的内部
goto:是从goto语句无条件的跳转到函数的另一条语句 //不要在程序中使用goto语句,这会使得程序既难理解又难修改
goto的语法:goto label; label是一个标示符,用于标识一条语句,如:end:return;这就是一句带标签语句,可以作为goto的目标,goto的作用域是一个函数内的,且不能跳过一个变量的初始化语句
return:结束当前函数
&与&&,|和||的意义与区别
|和&表示位运算,针对数值进行的运算,例如:3|2二进制表示即为11|10(省略前面的许多0),结果即是3,其结果仍然为数值
||和&&表示逻辑运算,||表示或,&&表示与,其结果是逻辑值true或false
如何选择switch case和if else语句
总结:当分支数为3时,switch和if 语句效率相当,当大于3时选用switch语句,反之if语句
特点:在汇编层switch语句是查找表,if语句是跳转
拓展:在选择分支较多时,选用switch语句会提高程序的效率,但switch只能处理字符或者数字类型的变量;if 结构更加灵活,应用范围更加广泛;注意switch语句,一但符合某个case,
那么程序从case后的冒号开始执行,直到遇到break,如果中间有创建局部变量,那么需要给case加大括号以便给局部变量限定作用范围,
字符问题
'0' = '48','a' = '97','A' = 65; '0'是字符,占一个字节,'1'是字符串占两个字节,另一个是结束符,ascii码,一般机器上,一个英文字母(不分大小写),占一个字节的空间,一个中文汉字占两个字节
bit是位,byte是字节,一字节等于8位,
printf输出格式
%格式,%d:整数,%c为字符,要看对应的ascii码
(1) %-3d:左对齐,占三位
(2) printf("%2d",123):原样输出123,printf("%5d",123);左边补两个空格123
(3) printf("%10f",1.25);小数要求补足六位的,没有六位的补0,结果是1.250000(实际上是0001.250000,要求是这样的,没有原因)
(4) printf("%5.3f",125);小数三位,整个五位,结果为1.250(小数点算一位)
(5) printf("%3.1f",1.25);小数一位,整个三位,结果为1.3(要进行四舍五入)
|和% 求余与求商
/:两边可以有小数,若有小数则结果也为小数,如果两边都是整型,结果也是整型, 4.5/1.5=3.0; 4.5/3=1.5; 8/4=2
%:两边要求是整数,且是取余 8%5=3;
逗号表达式:z= (2,3,4);此时值为4, z= 2,3,4此时值为2
转义字符
分为一般转义字符,八进制转义字符,十六进制转义字符,
一般转义字符:\0,\n,\',\",\\
八进制转义字符:'\141'是合法的,前导的0是不能写的
十六进制转义字符:'\x6d'是合法的,前导的0不能写,并且x是小写
函数地址
一但函数被编译并载入计算机中执行,它就会占用一块内存,这块内存有一个地址,因此函数也有地址,可以通过指针使用函数地址,就像可以使用变量的地址一样
void(*funcPtr());之所以用()把指针包起来,因为如果没有这个小括号,那么就像是一个函数声明式了,使用先右后左的原则去推断,意为:funcPtr是一个指针,它指向一个不带参数
并返回void的函数,理解时从中间开始:funcPtr是一个;向右走,(没有东西,被右括号拦住了);向左走发现一个*(...指针指向一个...);向右走发现一个空参数表(...没有带参数的函数);
向左走发现一个void(funcPtr是一个指针,指向一个不带参数并返回一个void的函数)
溢出以及短路求值
溢出:指的是当一个类型的值超出了它所限定的最大值之后,溢出的结果是不可预知的,很多系统都不会报溢出错误
短路求值:也即立即判死原则,在一个复杂的逻辑运算表达式中,一但某个运算对象可以确定整个表达式的值,那么之后的一些运算项就不会再继续计算,而是结束整个表达式
sizeof()的作用,求大小
对char或者类型为char的表达式执行sizeof()运算,结果得1
对引用类型执行sizeof()运算得到被引用对象所占空间大小,即此原对象占多少即为多少
对指针执行sizeof()运算得到指针本身所占空间大小
对解引用指针执行sizeof()运算得到指针指向的对象所占空间的大小,指针不需要有效
对数组执行sizeof()运算得到的是整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和,sizeof不会把数组当成指针来处理
有符号数和无符号数
有符号数和无符号数进行比较:首先把有符号数转换成无符号数再进行比较,输出比较结果时注意输出格式
例子:int a = -1;unsigned int b = 1; printf ("%d",a>b); //输出1
因为无符号数与有符号数比较时,要将有符号数转化为无符号数(若是负数则取绝对值原码的补码),再来比较
a转化为无符号数之后就是0xFFFFFFFF即65535,
char a = -1; 因为是ascii码,转换一下
unsigned char b = 1;
printf("%d",a>b); //输出0
这是因为两者被转为int了,a转化为int就表示-1,b转化为int就是1,前者小于后者
C学习笔记 知识集锦(一)的更多相关文章
- C++学习笔记 知识集锦(二)
1. 命名规范 2. 代码格式 3. QString的判断 4. 对象的判空 5. 隐式接口&显式接口 6. vector&string 7. static 8. const 9. v ...
- C学习笔记 知识集锦(二)
1. 数组和指针 2. 字符串赋值 3. memset&memcpy 4. 机器数和真值,原码,反码和补码 5. 文件指针和文件描述符 6. 内存泄露和内存损坏 7. 什么是不可移植的程序 ...
- C++学习笔记 知识集锦(一)
1.内存管理的开销 2.函数调用框架 3.类为什么要定义在头文件 4.C++的组合 5.在类的外部定义成员函数 6.bool类型为什么可以当做int类型 7.无符号保留原则 8.C++类型检查 9.何 ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
- paper 93:OpenCV学习笔记大集锦
整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...
- CLR via C#学习笔记----知识总概括
第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问C ...
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试
20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...
- Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识
目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...
随机推荐
- 【Java EE 学习 15】【自定义数据库连接池之动态代理的使用】
一.动态代理的作用 使用动态代理可以拦截一个对象某个方法的执行,并执行自定义的方法,其本质是反射 优点:灵活 缺点:由于其本质是反射,所以执行速度相对要慢一些 二.数据库连接池设计思想 1.为什么要使 ...
- ASP.NET Web API 提升性能的方法实践
ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...
- WPF中Ribbon控件的使用
这篇博客将分享如何在WPF程序中使用Ribbon控件.Ribbon可以很大的提高软件的便捷性. 上面截图使Outlook 2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可 ...
- Android 笔记 day4
单元测试
- Spring快速入门
什么是Spring Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 分层 SUN提供的EE的三层结构:web层.业务层.数据访问层(持久层/集成层) Strut ...
- Kindle支持哪些格式
官方产品介绍页面有相关技术参数: Kindle Format 8 (AZW3), Kindle (AZW), TXT,PDF, MOBI, PRC原格式,HTML,DOC,DOCX,JPEG,GIF, ...
- hdu分类 Dynamic Programming(这是一场漫长的旅途)
下面是difficulty 1的题 1003 Max Sum 最长递增子序列.非常经典,最棒的解法是在线算法O(n)的复杂度. 贴的呢,是用dp做的代码. 先是一个高亮的dp递推式,然后找到最大处 ...
- 在DrawingVisual上绘制圆形的进度条,类似于IOS系统风格。
1.说明:在WPF中,文件下载时需要显示下载进度,由于系统自带的条型进度条比较占用空间,改用圆形的进度条,需要在DrawingVisual上呈现. 运行的效果如图: private Point Get ...
- CAS登录时不仅仅需要用户名来确认身份的情况
最近在帮别人搞CAS,积累点经验 问题一:登录需要用户名和部门名称唯一确定一个用户,并将userid作为唯一标示. 在UsernamePasswordCredentials中添加userid 修改Qu ...
- Shader实例:边缘发光和描边
效果图: 1.边缘发光 思路:用视方向和法线方向点乘,模型越边缘的地方,它的法线和视方向越接近90度.点乘越接近0 那么用 1-减去上面点乘的结果,来作为颜色分量,来反映边缘颜色强弱. Shader ...