美文网首页C语言我爱编程C语言C++编程学习
神奇的C语言,这才是C语言大牛操作,作为面试题,怕是秒杀众人

神奇的C语言,这才是C语言大牛操作,作为面试题,怕是秒杀众人

作者: C语言学习 | 来源:发表于2018-07-27 23:20 被阅读4次

当然下面列出来的几点都是C的基础用法,只不过是这些用法可能平时不会被注意。所以很多东西第一次看到的时候,可能会觉得很怪异,但是细细想想就能很好的理解,也就能更好的清楚C语言的一些特性。但是在具体的编码过程当中,我还是希望都能老老实实规规矩矩的。因为程序员不需要太多棱角,把代码写得规范整洁比耍小聪明要重要得多。下面我列举了5个例子说明一些问题,如果你是老手看到这些就一笑而过吧,如果是新手,我相信还是会得到一些启发的。

1. #和##在宏中的作用,以及带参宏,参数的传递问题。

2. 结构体中域的偏移位置的计算问题。

3. 结构体的定义以及初始化的用法。

4. 数组和指针在运算中的等价关系。

5. 数组在栈中的“变异”。

1. 例子:

说明:

A) 预编译中#是将右边的参数转成一个字符串,##是将左右两边的参数连接成一个字符串。例子是#的用法。

B) 宏当中的参数其实是以逗号(,)分隔的,其他的字符其实都被看成同一个参数,但是换行和空白其实被处理过了,使参数在同一个行中。有兴趣的自己多做些测试吧,这个用法可以用于要写包含特殊字符的字符串,免得要写很多的转义字符(),但是中间不能有逗号,呵呵~

2. 例子:

说明:

A) &((struct _st*)0)->b 的作用是输出_st结构体中b的偏移。为什么用0当成指针呢,其实很好理解:如果一个_st结构体的地址是0,那么b的地址其实就是b在结构体中的偏移。

B) 其实按理,如果先做((struct _st*)0)->b运算,那么程序肯定异常,所以编译器还是做了优化的,具体编译器怎么做的,我也没深究。小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享

3. 例子:

说明:

A) 在结构体的初始化时,可以指定域进行初始化,如例子中的.c = 1,顺序可以颠倒,这样做的好处就是可读性较强,对于大结构的初始化,在阅读时很方便。缺点就是低版本的编译器可能不支持。

B) 在结构体的声明中,可以指定域的大小,如例子中的int a : 1; 说明a只暂用一个bit,充分展示了C对二进制处理反面的亲和力。

C) 为什么s.c输出是-1,而不是1,其实很简单,因为0xFFFFFFFF表示的是-1,那么一个1bit大小的变量,所有位上面都是1,那么它也表示-1。所以编码的过程中,有符号和无符号混用其实是很危险的一件事情。

4. 例子:

说明:

A) 0[a] = 'x';是什么玩意儿?如果写成a[0]='x';其实你就明白是什么意思了,但是说白了,a[0]和0[a]在编译器看来是一样的。因为数组在做[]运行时,其实是做指针的加法运行:a[0]等价于*(a+0)。所以0[a]也就等价于*(0+a)是完全正确的。小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享

5. 例子:

说明:

A) 为什么两行的结果会不一样?在一般情况下,按我的理解,一个数组a,&a和&a[0]的值是一样的。但是当a在形参当中时就不一样了。例子中,func函数中的a,其实a变量是在func函数的栈当中,在func内部,a其实已经被转化成char *a,所以&a是表示指针变量a在栈中的地址,而&a[0]表示的是指针指向的内存空间的第一个元素的地址,其实也就是调用者传入的数组的第一个元素的地址。不知道我说明白了没有!!

B) 这个可能比较难理解,关键是明白一点,在数组作为形参时,是被转换成指针看待的。

相关文章

  • 神奇的C语言,这才是C语言大牛操作,作为面试题,怕是秒杀众人

    当然下面列出来的几点都是C的基础用法,只不过是这些用法可能平时不会被注意。所以很多东西第一次看到的时候,可能会觉得...

  • C语言面试题收集

    参考: C语言十二道有趣的面试题(1) C语言十二道有趣的面试题(2) exit()和_exit()的区别 C语言...

  • VC 在调用main函数之前的操作

    在C/C++语言中规定,程序是从main函数开始,也就是C/C++语言中以main函数作为程序的入口,但是操作系统...

  • iOS常见面试题总结

    1.objective-c常见面试题:1、**OC **语言的基本特点OC 语言是 C 语言的一个超集,只是在 C...

  • 新手C语言教程第一弹|感性认识一波C语言

    什么是C语言 为什么选择C语言作为初学者首先接受的语言呢,因为C语言是很多语言的基础,C++语言是C语言的超集,J...

  • “学习,是一种升级”文集目录

    一、C语言 C语言学习:链表的概念和其简单操作 C语言学习:关于数据的几种排序算法 C语言项目:学生信息管理系统 ...

  • [Swift]结构体指针操作

    C语言的指针操作 在c语言中申明一个变量并通过指针修改该变量的值 a value is 2 c语言操作结构体指针操...

  • c++_动态对象创建

    一.c语言 c语言使用malloc 来创建堆对象 二.c++ new操作符 delete操作符 如果new []...

  • 我的书目

    基础篇: 语言(c, scheme): c:命令式语言的代表, 高级语言,最接近底层的高级语言。操作系统的实现语言...

  • C语言面试54题

    C语言面试54题 ​ 大家好,这期呢,我们谈一下c语言的面试题。 第1题,c语言有哪些核心的特征? 可移植性很强。...

网友评论

本文标题:神奇的C语言,这才是C语言大牛操作,作为面试题,怕是秒杀众人

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