美文网首页
那些年C语言走过的坑

那些年C语言走过的坑

作者: _城南花已开_ | 来源:发表于2019-05-15 21:10 被阅读0次

一、逗号运算符

在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
例如:

  1. int a1, a2, b = 2,c = 7, d = 5;

  2. a1 = (++b, c--, d++);

  3. a2 = ++b, c--, d++;

其中第 2,3行就是使用了逗号运算符。

但是这两个表达式表达的意思不尽相同。

注意:

逗号运算的结合性是从左至右,完毕后整个表达式的值根据有无括号而不同。如果加上括号,则返回最后一个运算,没有就返回第一个。
例题中的计算结果a1 = 5,a2 = 4,其原理就是在计算a1的时候返回的是最后一个运算即d++(a1 = d++ = 5(先赋值再再进行加一操作)),但是此时b已经进行过了++b运算 值为3,c进行了c--运算 值为6);计算a2的时候返回的是第一个运算即++b(先加一再赋值),得a2值为4, 但是计算从左至右直到分号结束,则再进行c--操作,接着就是d++操作。

二、宏定义

概念

宏定义是C语言提供的三种预处理功能的其中一种(宏定义,文件包含,条件编译),宏定义和操作符的区别在于宏定义是替换,不做计算,也不做表达式求解,故又称宏代换、宏替换。

格式

#define 标识符 内容
其中标识符又可称为宏名, 一般采用的是大写
例:#define PI 3.1415926 

注意

  1. 宏定义能提高程序的通用性和可读性,减少输入错误,便于修改
  2. 在编译前处理,即不尽兴语法检查
  3. 宏定义可以使用#undef命令终止其作用范围
  4. 宏定义允许嵌套
  5. 宏定义中不存在变量类型,也没有类型转换
  6. 宏定义中可以使用变量进行使用,调用的时候传参就好
  7. *宏定义只替换, 不做计算,也不做表达式求解

例子:

#define M(x,y,z) x*y+z
#include<stdio.h>
int main()
{
    int a=1, b=2, c=3;  
    printf("%d\n",M(a+b,b+c,c+a));
}
只替换,不计算->a+b*b+c+c+a = 12;
而不是(a+b)*(b+c)+(c+a) = 19;

三、传参问题

当我们把一个指针作为参数传给一个函数的时候,其实只是把指针的副本传递了过去,也可以说传递指针是指针的按值传递。尽管它是一个指针,但如果我们在函数内部修改指针会出现问题,在方法里做修改只是修改指针的副本而不是指针本身,原来的指针还保留着原来的值。如果想用真正传递,可以使用二级指针或者指针的引用。
如果进行的是指针的引用,这个时候传入的不是指针的副本了,而是指针的本身,相当于取了个别的名字而本质未改变,改变了它的指向或者值,相应的全部都改变了。

例题:

#include   <string.h>
#include   <stdio.h> 
#include   <stdlib.h> 
void getmemory(char*p)  {    
    p=(char *) malloc(100);    
    strcpy(p,"hello world"); 
} 
int main( ) {
    char *str=NULL;
    getmemory(str);        
    printf("%s\n",str);      
    free(str);       
    return 0;    
}
ps:这个时候输出的就是null了,因为strcpy(p, "hello world")
改变的只是主函数中str的副本,而不是它本身,当函数结束后返回主函数,str依旧指向空。

四、数组指针

例题:

#include<stdio.h>
main(void)
{
     int a[5]={1,2,3,4,5};
     int *ptr=(int *)(&a+1);
     printf("%d,%d",*(a+1),*(ptr-1));
}

分析

数组名就是一个指针,这样假设有个 p = int()(&a)这个时候p就是指向a这个一维数组的指针,即数组指针, 而这个时候p的步长就是a数组的长度,即(p+1)将跨过n个整型数据的长度; ptr也是一个数组指针,不过进行了加一操作,即跳出了数组a的范围,进行(ptr-1)操作则回到数组,此时指向的是a数组的末尾元素即a[4];所以输出的结果是 2, 5;

相关文章

  • 那些年C语言走过的坑

    一、逗号运算符 在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一...

  • 那些年走过的坑!

    记得读大二的时候,一位大四的学长语重心长的跟我分享他的大学感受。他说,他的大学四年学到东西最多的是大三大四,巴拉巴...

  • 那些年,我走过的坑

    一 同学们都在写论文的时候,我抱着小说啃的不亦乐乎。好友催促我说:你赶紧开始写论文吧,别到时候写不完了。我一向自诩...

  • 那些年走过的购物“坑”

    女孩子爱美是天性,从头到脚,无一处不精致,无一处不花费心思。 大学时代,口袋里没有两分钱,头脑里对于“美”更是...

  • 敬那些年走过的坑

    回忆跟某人十年点滴 相遇太美 相处太多不如意 希望满满的计划着未来 生活被失望点点磨平 不懂日子如何过 也不懂婆媳...

  • C语言的坑

    一 前言 C相对其他语言来说比较古老了,单从语法来说看似简单,其实也有不少坑的,稍有不慎就中招。 二 有符号和无...

  • C++ - 邂逅对象

    C的++ 本文为那些年我们追过的语言之C++篇。C语言的命名来源于其参考的B语言. 而C++的命名, 正因为所有C...

  • 那些年,我们减肥走过的坑

    最近收到一位女粉丝来信,她身高165cm,体重63kg,通过节食减肥的方式成功减去8kg,但恢复正常饮食仅一个月又...

  • 那些年减肥走过的坑(二)

    我们今天接着分享减肥之路上的很多陷阱。 -01- 生活方式上的健康隐患 生活方式和生活条件,对个体健康起着决定作用...

  • 那些年减肥走过的坑(三)

    我们今天接着分享减肥之路上的很多陷阱。 -01- 减肥成功后,就以为万事大吉 减肥成功后,会以为自己的体质已经完全...

网友评论

      本文标题:那些年C语言走过的坑

      本文链接:https://www.haomeiwen.com/subject/bhtvaqtx.html