1 程序存在一定顺序点 指的的在执行过程中修改变量值的最晚时刻
在程序达到顺序点的时候 之前所做的一切操作必须反映到后续的访问中
2顺序点如下:
·每个完整表达式结束时
·&& || ?:三目运算符 以及逗号表达式;的每个预算对象计算之后
·函数调用中对所有实际参数的求值完成之后(进入函数体之前) 即先计算在传入值
@f(k, k++); /* 在进入函数前已经计算好了 k k++; 遇到;逗号表达式++生效k++-> k=2 所以 2 ,1 */
@k = k++ + k++; /* 1. 2+2=4 未到达顺序点 2. 此时遇到;顺序点++计算生效 再计算两个++ 得到6 */
@if( a-- && a ) /* 这里的顺序点为&& 当预算到&&时--预算 所以为false */
4.注释 ///**/建议使用 // 避免一些版本控制软件出现解析问题
1. // this is \ ok heh 加\表示 换行 \为换行符
2. 会在编译过程不是简单删除注释 而是用空格代替
3. ""内的注释无效 编译器认为都是字符串
4. "/*.....*/"不能被嵌套
5. 出色的注释:
1 准确易懂 防止二义性 错误的注释有害而无利
2 注释是对代码的提示 避免臃肿
3 一目了然的代目避免加注释
4 不要用缩写来注释代码 这样可能会产生误解
5 注释用于阐述原因不是用于描述程序的运行过程
5.接续符\ 和转义符
1.在连续单词时 反斜杠不能有空格 下一行之前也不能有空格
2.接续符适合在定义宏代码块时用
3.转义符\主要用于表示无回显字符 作为转义符使用时必须出现在字符或者字符串中
6.逻辑运算符 || && !
1.注意||&&的短路运算
||有1则为真
&&有0则为假
! c语言中的"!"只认得0 只知道见了0就返回1 因此只要不是0 其运算结果都是0 eg:!100 = 0;
2.三目运算符
(a? b:c) 当a为真时返回b的值 否则返回c的值
7.++ --
1. int k = (++x, x++, x+10); // k=15 x=3 从左往右计算
2. int i = 0;
int j = (++i)+(++i)+(++i);
/* j=7 原因是先加前两个括号内的为1+2 再加 4*/
贪心法读++
1. 编译器处理的每个字符应该尽可能多的包含字符
2. 编译器以从左向右的顺序一个一个尽可能多的读入字符
3. 当即将读入的字符不可能和已读入的字符组成合法符号为止
8.位运算
1.& 按位与0&1 = 0
| 按位或0|1= 1
^ 按位异或0^0 1^1= 0 相同取0 不同取1 与0异或为A不变
~ 取反
<< 左移高位丢弃 低位补0
>> 右移高位补符号位 低位丢弃 正数符号位为0 eg:8>>3 (1000>>3) = 0001 = 1
2.放错准则
1. 避免逻辑运算符 位运算符出现在同一表达式中 当出现时尽量用括号()来
2. 小技巧:
左移n位相当于*2的n次方
右移n位相当于/2的n次方
3.右移x>>2 右端低位移除部分舍弃 左端高位根据符号位补0或者1 无符号或正数补0 负数补1
3.通过异或交换a b的值 表面上看去少使用了一个变量 但是实际上对内存的读写次数提高了 所以效率并不高
a = a^b;
b = a^b;
a = a^b;
9.C语言的隐式转换类型
1 算术运算式中 低类型转换为高类型
2 赋值表达式中 表达式的值转换为左边变量的类型
3 函数调用时 实参转换为形参的类型
4 函数返回值 return 表达式转换为返回值类型
char ->shortchar->int
short->int
int ->unsigned int ->long ->unsigned long ->double <- float
江老师的神图: http://www./
![]() |
|