1.若未对变量进行初始化,则其默认初始值为该3地址原来所存储的值
2.scanf函数要加&,例scanf("%d",&a);
3.出现在scanf引号内的东西是在输入时一定要输入的东西,而不是要你看到东西,所以输入的内容其格式必须与引号内保持一致
4.常量可以直接写,也可以用const定义,格式:const 类型 常量名 值(const int amount 5)。在定义常量时经常使用大写,以便于区分
5.注意区分C语言中的整形和浮点型。10和10.0就是不同的,两个数都除以3,其结果不一样,整数运算结果只能时整形。在表达式中只要出现过一次浮点型,即使其他为整形,其运算结果也仍然为浮点型
6.区分运算符和算子
a = b + 7 (a,b,7都为算子。=,+都为运算符)
7.表达式运算的优先级别
一般式子都是自左向右,而对于单目运算符+-和赋值运算符=则时自左向右
(result = a = b = c + 5,即先计算c+5并赋值给b,再赋值给a,最后赋值给result)
8.关系运算符的结果
当两个值的关系符合关系运算符的预期时,关系运算的结果为整数1,否则为整数0
例:printf("%d\n", 5==3); 结果为0
9. 所有的关系运算符的优先级比算术运算的低,但是比赋值运算的高
例如:7>=3+ 4 (3+4先计算,再与7比较,结果为1)
int r = a>0;
判断是否相等的==和!=的优先级比其他的低,而连续的关系运算是从左到右进行的.
10.在程序调试出现错误时,除了可以使用debug调试外,还可以在必要的地方插入print语句,然后运行看输出结果在哪里出现问题
11.一句话结束的后面一定要加上分号
12.for循环三部分分别为循环初始条件,循环结束条件,循环每轮要做的动作
13.把某一个变量的定义放到for循环内定义,只允许在C99中使用
14.任一for循环可以改造成while循环,for中的条件可以省略,但是分号不可以
15.循环的选择
如果有固定次数,用for
如果必须执行一次,用do_ while
其他情况用while
16.优先级的比较
17.短路:逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计 算
18.条件运算符(?:)的优先级高于赋值运算符,但是低于其他运算符
19.断点处的句子表示该句子还没有执行
20.else总是和最近的if匹配,即使有缩进也不能改变。所以好的编程习惯总是在if,else后面加括号
21.switch-case语句:不要忘记break,可以用default来表示结束的case。同时要注意switch后面所跟的type类型必须为整数型
22.用rand()生产随机数,需要在程序开头添加如下代码:
#include <stdl ib. h>
#include <time. h>
23.有一个比break更厉害的——goto,但是goto后面要加自己定义的东西,然后运行到此时,就会 跳到对应的相同代码处在(多层循环处可用,其他地方尽量少用)
24.函数的定义
25.void类型的函数,可以没有return语句
26.C的编译器是自上而下分析代码的,故若自定义函数写在main函数下方,则需要在main函数之前写上该函数的函数声明(即函数头加分号,也叫函数原型,该部分并不是函数)
27.每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系。过去,对于函数参数表中的参数,叫做“形式参数”,调用函数时给的值,叫做“实际参数”。
28.本地变量
函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量
定义在函数内部的变量就是本地变量
参数也是本地变量
29.生存期和作用域
生存期:什么时候这个变量开始出现了,到什么时候它消亡了
作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)。对于本地变量,这两个问题的答案是统一的: 大括号内--块
30.调用函数时的逗号和逗号运算符怎么区分?
调用函数时的圆括号里的逗号是标点符号,不是运算符
f(a,b)表示函数中有两个参数
f((a,b))表示该函数中仅有一个参数
31.C语言不允许函数的嵌套定义,可以在一个函数中写另一个函数的声明,但是不可以写两一个函数的定义
32.用该语句可以直接得到数组的单元个数
33.数组作为函数参数时,往往必须再用另一个参数来传入数组的大小
不能在[]中给出数组的大小
不能再利用sizeof来计算数组的元素个数!
正确的方法
34.运算符&
scanf(“%d", &i);里的&是运算符,作用是获得变量的地址,它的操作数必须是变量
在print中,用%p来获取地址,不是%d,因为所取地址是4字节还是8字节有电脑定。
在32位和64位的电脑中,所取得的地址大小是多少位,和int是否相等是不一定的。取决于编译 器
&不能对没有地址的东西取地址(例如:&(i++)就不是地址)
35.C语言中的变量在内存中保存与堆栈中,堆栈自定向下分配内存。先写的变量内存更高,后写的变量内存更低。
36.在数组中,用printf输出a、a[0]、&a,三者输出的结果相同,都为数组a的首地址
37.指针*
指针就是保存地址的变量
- 例如:int* p = &i;(指针p指向i,即p中存放着变量i的地址)
- int* p,q;
- int *p,q
- 这两句话是一样的,*既可以靠近p也可以远离p。都表示指针类型的p和int型的q
38.作为参数的指针
、
39.访问那个地址上的变量*
*是一个单目运算符,用来访问指针的值所表示的地址上的变量,可以做右值也可以做左值。
40.在函数的参数中所传的参数a[],实际上等价于*a,所传递的就是a的地址。参数表中的数组实际上是指针。
如下所示的四种函数即是等价的
41.数组变量是特殊的指针
数组不能被赋值,即若a和b都是数组,则不能用b = a把数组a赋值给数组b
42.逃逸字符
43.字符串
用指针方式定义字符串时,指针指向一个地址很小的地方,位于程序的代码段,该部分只允许读操作,故不可以对字符串进行修改。
而用数组定义的字符串,则会给字符串的每个字符都赋予不同的地址,所以字符出串每个地址上的内容都是可以修改的。