C语言学习总结

目录

变量与函数

指针与数组

位运算

运算符和优先级

持续更新中。。。。。。


变量与函数

  1. 变量既可以定义为外部的(全局的)也可以定义为局部的;函数只能定义为全局的,也就是说不能在函数中再定义函数
  2. 全局变量和函数从其声明的地方开始生效,到其所在文件末尾失效。
  3. 函数的声明既可以在函数外部也可以在函数内部(对于函数来说声明不同于定义),以int max(int x, int y)为例:

在函数外声明:
 

...
int max(int x, int y);    //声明函数
int main(){...}
int max(int x, int y){...}    //函数定义
...

在函数内部声明(只在声明其的函数内部生效):
 

...
int main()
{
	int x, y, max(int x, int y);	//声明了一个两个int形参和返回int的函数
	...
	max(x, y);
}
int max(int x, int y){...}	//函数定义
...

指针与数组

  1. C语言的一大优点就是将指针、数组和地址的算术运算结合起来。使用数组下标所能完成的操作用指针都能完成。一般来说,用指针编写的程序比用数组下标编写的程序要快,因为所有的下标都要转换为指针形式,如:
    在取a[i]值时C语言要首先转化为地址a+i然后在访问其值。

  2. 有效的指针运算:相同类型指针之间的赋值运算、指针同整数之间的加减运算、指向相同数组中的两个指针之间的减法或赋值运算、将指针赋值为0或与0之间的比较运算。

  3. void * 指针指向空类型的元素,且任何类型的指针转换为void *,并且在将它转换回原来的类型时不会丢失信息,可用于编写一些可复用、通用性好的函数,如malloc函数。

位运算

  1. &:常用来将某位数置为0,如:11110110 & 11111101 = 11110100将第二位置为0,别的位保持不变。
  2. |:常用来将某位数置为1,如:11110110 | 00001000 = 11111110将第四位置为1,别的位保持不变。
  3. ^:常用来将某位数取反一个数和同一个数^两次还是它自己,即a^b^b = a。如:11110110 ^ 00000010 = 11110100将第二位取反,别的位保持不变。也可以用来交换两个数:
int a = 20, b = 10;

a = a ^ b;
b = a ^ b;    //b = a ^ b = (a ^ b) ^ b = a
a = b ^ a;    //a = b ^ a = a ^ (a ^ b) = b

运算符和优先级

  1. C语言中的单目运算符(除()、[])都是自右向左结合的,[]的优先级较高,可注意int *a[5]与int (*a)[]的不同。
  2. 条件运算符?:也是自右向左结合。
  3. “.”、“->”、“()”和“[]”4个运算符优先级最高。
  4. C语言没有指定同一运算符中多个操作数的计算顺序(除&&、||、?:和,),也没有指定函数中各参数的求值顺序,如:
    a[i] = i++;    //不能确定a[i]中i的取值,可能取i加1之前的值也有可能取i+1后的值
    
    printf(“%d %d\n”, ++n, power(2, n));    //不能确定power(2, n)的调用是在++n之后还是之前
    所以应当尽量避免使用此种含糊不清的语句。
  5. 运算符优先级例子
例1:比较*s++、(*s)++、*++s和++*s
    *s++ 等价于*s,  s++;
    (*s)++ 等价于*s += 1;
    *++s等价于++s,*s;
    ++*s等价于++(*s)。
例2:结构体
    struct {
        int len;
        char *str;
    } *p;
    比较++p->len、(++p)->len、(p++)->len、*p->str、*p->str++、*p++->str
    ++p->len:隐含括号关系++(p->len),将len的值加1
    (++p)->len:先执行p的加1操作,再取len的值
    (p++)->len:先取len的值,再执行p的加1操作
    *p->str:隐含括号关系*(p->str),取指针str指向的值
    *p->str++:隐含括号关系*(p->str)++,先取指针str指向的值,再将str加1,与*s++相同
    *p++->str:*p->str, p += 1;
    *++p->str:p += 1, *p->str

 

持续更新中。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值