• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
浅浅念
生如夏花之绚烂,死若秋叶之静美
博客园    首页    新随笔    联系   管理    订阅  订阅
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,前者小于后者

学习无他法,唯有持之以恒
posted on 2016-11-15 11:22  浅浅念  阅读(669)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3