1.赋值语句:
变量先声明再赋值,一条赋值语句占用一行
2.对i++、++i、i--、--i自增表达式的理解:
前置++/--运算符为变量值加一/减一后参与运算,后置++/--运算符则为变量先参与运算然后值在加一/减一
3.编程风格:
编写条件判断语句时常量值应放在前面,以避免书写错误而造成的bug;编写循环语句时把只参与一次的运算放在循环体外,以提高效率。
4.类型转换:
c语言中的强制类型转换为在变量前加上所要转换的类型:
int val = 0x12ff;
char c;
c = (char)val;
隐含的类型转换的情况:a.在混合类型的算术表达式中;
b.用一种类型的表达式赋值给另一种类型的对象;
c.把一个表达式传递给一个函数,调用表达式的类型与形式参数的类型不相同时,则会转换为函数的形式参数的类型;
d.从一个函数返回一个表达式的类型与返回类型不同时,则会转换为函数返回值类型。
5.运算符问题:
主要掌握运算符的优先级,判断表达式中先运算什么,再运算什么。
6.变量的交换与比较:
两个数的交换函数
方法一:
<span style="font-family: Arial, Helvetica, sans-serif;">void swap1(int *a, int *b)</span><pre name="code" class="cpp"> <span style="font-family: Arial, Helvetica, sans-serif;">{ </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> int temp;</span>
<span style="font-family: Arial, Helvetica, sans-serif;"> temp = *a;</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> *a = *b; </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> *b = temp; </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> }</span>
方法二:
void swap2(int *a, int *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
两个数大小的比较函数
方法一:
<pre name="code" class="cpp"> <span style="font-family: Arial, Helvetica, sans-serif;">int max1(int a, int b) </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> { </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> return a >= b ? a : b; </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> } </span>
方法二:
<span style="font-family: Arial, Helvetica, sans-serif;">#define abs(A) (((A) >= 0) ? (A) : (-A)) </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> int max2(int a, int b)</span>
<span style="font-family: Arial, Helvetica, sans-serif;"> {</span><pre name="code" class="cpp"> return ((a+b)+abs(a-b)) / 2;
}
7.宏定义与const的区别:
掌握宏定义的语法,在宏中将参数用括号括起来,防止出现边际效应。
区别:const常量有数据类型,而宏常量没有数据类型;
const常量可以进行调试,但是宏常量不能进行调试。
const修饰指针的情况:若const在*的左侧,则指针所指的变量为常量,即变量值不允许改变,但指针可以指向其他地方;
若const在*的右侧,则指针为常量,即指针不能指向其他地方。
8.sizeof与strlen的区别:
a.sizeof操作符的结果类型是size_t;
b.sizeof是运算符,strlen是函数;
c.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以‘\0’结尾的;
d.数组做sizeof的参数不退化,传递给strlen就退化为指针;
e.sizeof在编译的时候就计算过了,是类型或是变量的长度;
f.strlen的结果要在运行时才能计算出来,用来计算字符串的长度,而不是类型占内存的大小;
g.sizeof后如果是类型必须加括号,如果是变量名可以不加括号;
h.当使用了一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。
sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸;
i.数组作为参数传给参数时传的是指针而不是数组,传递的是数组的首地址;
j.计算结构体变量的大小时要考虑数据对其的问题;
k.sizeof操作符不能用于函数类型、不完全类型或位字段。
9.内存中的数据对齐:
sizeof计算栈中分配的大小。
一般情况下,地址总线总是按照对齐后的地址来访问的。
struct结构体的长度一定是其中最长的数据元素的整数倍。
CPU的优化规则是:对于n字节的元素(n=2,4,8,...),它的首地址能被n整除,才能获得最好的性能。
10.内联函数和宏定义:
内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。而宏只是一个简单的替换。
内联函数要做参数类型检查,这是内联函数跟宏相比的优势。
inline一般只用于如下情况:a.一个函数不断被重复调用
b.函数只有简单的几行,且函数内不包含for、while、switch语句