C基础部分备忘
*强制类型转换得到所需类型的中间变量,原变量类型不变:
*++ -- 不能用于常量(因为常量值不可变)和表达式,属于单目运算符,结合方向自右向左
*在调用函数时,对于实参的求值顺序,ANSI并无规定,因编译器而异
*关系运算符的结合方向:自右向左。关系表达式的值只能是真或假
*优先级: ! > && > ||, ?:表达式去较高的类型
*位运算运算对象只能是整型或字符型数据,不能是实型数据
*break不能用于除循环语句和switch语句之外的任何语句
*变量存储类型:auto,register,static,extern
*形参属于局部变量
*extern关键字每个引用的函数都要加,extern用以说明程序级的变量
*变量的作用域:程序级,文件级,函数级,语句块级
*auto,register是动态变量,static是静态变量
*static变量所在的函数被调用结束后,也不释放存储单元,作用域外不可见
*局部静态变量值具有可继承性(如循环中变量的值为上次循环改变后的值)
*外部变量(extern)只能存放在内存的静态存储区,在整个程序的运行期间一直占用内存单 元
*register型变量个数受限,且不能为long,double,float型
*局部static具有全局寿命和局部可见性
*extern不是变量定义,可扩展外部变量的作用域
*外部函数是可被程序中的其它文件所调用的函数
*内部函数只能被本文件中其它函数调用,用static声明
*函数调用中的数组:实参用数组名,形参用数组定义,数组元素做函数参数属于值传递,数组名作函数参数是地址传递
*goto语句不能用整数做标号, 只能出现在goto坐在函数内,且唯一,只能加在可执行语句前
*宏定义可以嵌套,不可以递归,如:#define max max+10 错误
#define width 80
#define length width+40
var = length*2;
宏展开:var = 80 + 40*2;结果并非预期那样,因为#define句没有括号,宏定义中最好 加入括号
可以用宏名代替字符串,当宏定义在一行中写不下,需要在下一行继续时,只需在最后一个字符后加一个“/”(注:第二行开始不要有空格,否则空格会被一起替换掉)
*宏名有效范围为定义命令之后到本源文件结束,除非用#undef命令终止宏名的作用域。
*宏定义中,双引号“”阔气的字符串内的子串和用户标识中的成分不替换
*#define S (r) PI*r*r相当于S代表“(r) PI*r*r”
#define Power(x) x*x
x = 4;y = 6;
z = Power(x + y);宏展开:z = x + y * x + y;
#define Power(x) ((x) * (x))宏展开:z = ((x + y)*(x+y))
*include指令中“”引起的表示现在当前目录搜索,在搜索标准目录,目录可指定路径,<>引起的直接按便准目录搜索
*条件编译:#ifdef 标识符
程序段1
#else
程序段2
#endif
若指定的标识符已经被#define定义过,则只编译程序段1,否则编译程序段2
#ifndef 标识符
程序段1
#else
程序段2
#endif
如果指定的标识符没被#define定义过,则编译程序段1,否则编译程序段2
#if 表达式
程序段1
#else
程序段2
#endif
若指定的表达式为真,则编译程序段1,否则编译程序段2
*int i= 15;
int data[i];
这种写法是错误的,不能用变量定义数组维数
*数组不初始化,其元素值为随机数,对static数组元素不赋初值,系统会自动赋以0值
*int a[5] = {1,3,4}
等价于:a[0] = 1; a[1] = 3; a[2] = 4; a[3] = 0; a[4] = 0;
*当全部数组元素赋初值时,可不指定数组长度
*char str[] = "hello",存储为:h e l l o /0
char str[] = {'h','e','l','l','o'},存储为:h e l l o
*int array[-100];错误
float i = 3;
a[i] = 10;错误
*char ch[5] = {'b','o','y'};存储为:b o y /0 /0
*main()
{
char str[5];
scanf("%s",str);
printf("%s",str);
}
用字符数组名时,不要加&,以空格或回车结束
%s遇到/0结束,空格或者回车结束后,系统自动补/0
*puts函数输出完换行
*gets从键盘输入一个以回车结束的字符串放入字符数组中,并自动加'/0'
*strcat,strcpy返回字符数组第一个参数的首地址
*不能赋值语句为一个字符数组赋值,如:char str1[20],str2[20]; str1 = {"hello"}错误
str2 = str1;错误
*strcmp(字符串1,字符串2)若1 < 2,返回负整数,若1>2,返回正整数,若1=2,返回0,字符串比较不能用==
*strlen返回字符串实际长度,不包括'/0',如:
char s[10] = {'a','/0','b','c','/0','/0'};
则 strlen(s) = 1
char s[] = "/t/v///0will/n"
strlen(s) = 3
char s[] = "/x69/082/n"
strlen(s) = 1
*用无名结构体直接定义变量只能用一次
*结构体类型不分配内存,不能赋值,存取或者运算;结构体变量则是分配内存,可以赋值,存取,以及运算
*结构体可以嵌套
*结构体变量不能整体引用,只能引用变量成员,可将一个结构体变量赋值给另一个同类型结构体变量
*共用体变量任何时刻只有一个成员存在
*共用体变量中起作用的是最后一次存放的成员
*不能再定义共用体变量时初始化,可用一个union为另个赋值
*typedef用自定义名字为已有数据类型命令,typedef tpye name
typedef int INTEGER
*typedef定义类型,不能定义变量,没有创造出新数据类型。