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 ...
随机推荐
- EventBus 二
前一篇简单演示了EventBus的onEventMainThread()函数的接收,其实EventBus还有另外有个不同的函数,他们分别是: 1.onEvent2.onEventMainThread3 ...
- 转载:Tomcat的JVM设置和连接数设置
Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:set JAVA_OPTS=-Xms256m -Xmx512m Linux环境下修 ...
- 【NOI2016】优秀的拆分 题解(95分)
题目大意: 求一个字符串中形如AABB的子串个数. 思路: 用哈希做到O(1)判断字符串是否相同,O($n^2$)预处理,ans[i]为开头位置为i的形如AA的子串个数.再用O($n^2$)枚举出AA ...
- CentOS7 编译安装 Nginx (实测 笔记 Centos 7.0 + nginx 1.6.2)
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso 安装步骤: 1.准备 1.1 显示系统版 ...
- Javascript初学篇章_4(循环与函数)
七.循环语句 1.While 语法: while (exp){ //statements; } 说明: while (变量<=结束值){ 需执行的代码 } 例: var i=0; while(i ...
- linux系统安装(下)
Grub引导装载程序 目录简单介绍 /dev存放了设备文件 /dev/sad硬盘文件 root/install.log安装日志 root/kickstart包含这次安装信息,下次若需要相同安装可 ...
- LruCache为GridView异步加载大量网络图片
MainActivity如下: import android.os.Bundle; import android.widget.GridView; import android.app.Activit ...
- HBuilder从下载到使用
听别人谈论这货,于是决定长长见识,见见世面,便屁颠屁颠到网上下一个,满怀好奇的研究了一下.对用过eclipse这款软件的人来说,上手非常容易. ☆ 准备工作 ① 确认自己的电脑连接网络,能下载东西. ...
- 简单的行为控制管理方法,自动登录,session定时验证码过期
代码很简单 实现的方式很多,用cookies 用static 变量 file文件缓存 等等 比如 //简单行为管理,如果请求此方法次数多于5次,就显示验证码 吧当前方法的name传进来,有效时间是5分 ...
- js 中将日期转换为星期需要注意的
new Date(strDate); 中strDate需要是1998/10/30这样的格式,如果是1998-10-30的格式,不一定旧版本的web能兼容