虽然自己敲了4年多代码了,但是还不敢说自己精通了C语言,今天研究了一番,介绍几个有意思的问题吧。
前言
自己虽然一直交叉的敲着 C 和 c plus plus 两种语言,但是其实自己就是使用一下常用的语法。
工作后又没有那么时间来看书,于是研究了一些C语言的细节来学习学习。
建议看的时候先不要看问题分析,这样才能考察自己到底会不会的。
遍历数组
问题
有时候我们要遍历一个不知道大小的数组,但是我们有数组的名字,于是我们可以通过 sizeof 获得数组的大小了。
有了大小我们就可以遍历这个数组了。
一般情况下大家都是从下标 0 开始计数,于是从来不会遇到下面的问题。
如果你遇到下面的问题你能想出是什么原因吗?
代码
#include
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};
int main() {
for(int d=-1; d
h(f(1,2))
↓
> g(f(1,2))
↓
> g(12)
↓
> g(12)
↓
> "12"
对于第二个,是这个过程。
↓
> g(f(1,2))
↓
> "f(1,2)"
print 返回值
问题
你知道 printf 的返回值是什么吗?
猜猜下面的代码输出是什么吧。
代码
#include
int main() {
int i=43;
printf("%d ",printf("%d",printf("%d",i)));
return 0;
}
输出
4321
Process returned 0 (0x0) execution time : 0.035 s
Press any key to continue.
end
分析
printf 的返回值是输出的字符的长度。
所以第一个输出 43 返回2.
第二个输出 2 返回 1. 第三个输出1. 于是输出的就是 4321 了。
数组参数
问题
对于函数传参为数组时,你知道到底传的是什么吗?
代码
#include
#define SIZE 10
void size(int arr[SIZE][SIZE]) {
printf("%d %d ",sizeof(arr),sizeof(arr[0]));
}
int main() {
int arr[SIZE][SIZE];
size(arr);
return 0;
}
输出
4 40
Process returned 0 (0x0) execution time : 0.039 s
Press any key to continue.
end
分析
对于第二个输出,应该是 40 这个大家都没有什么疑问的。
但是第一个是几呢?
你是不是想着是 400 呢?
答案是 4.
这是因为对于数组参数。第一级永远是指针形式。
也就是说数组参数永远是指针数组。
所以第一级永远是指针,而剩下的级数由于需要使用 [] 运算符, 所以不能是指针。
sizeof 的参数
问题
当我们有时候想让代码简洁点的时候,会把运算压缩到一起。
但是在 sizeof 中就要小心了。
代码
#include
int main() {
int i;
i = 10;
printf("i : %d ",i);
printf("sizeof(i++) is: %d ",sizeof(i++));
printf("i : %d ",i);
return 0;
}
输出
i : 10
sizeof(i++) is: 4
i : 10
Process returned 0 (0x0) execution time : 0.039 s
Press any key to continue.
end
分析
你猜第二个i的输出时什么呢?
11 吗?
恭喜你,猜错了。
这个还需要查看文档了。
首先我的印象中 sizeof 是个宏,在编译器运算的。
The sizeof is a keyword, but it is a compile-time operator that determines the size, in bytes, of a variable or data type.
文档上说 sizeof 是一个关键字,但是在编译器运算。
所以编译器是不会进行我们的那些算术等运算的。
而是直接根据返回值推导类型,然后根据类型推导出大小的。
位运算左移
问题
这个问题没什么说的,你运行一下就会先感到诧异,然后会感觉确实应该是这个样字,甚至会骂这代码写的太不规范了。
代码
#include
#define PrintInt(expr) printf("%s : %d ",#expr,(expr))
int FiveTimes(int a) {
return a
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?