您当前的位置: 首页 >  张巧龙 c语言

敲代码4年,发现C语言里几个有意思的问题

张巧龙 发布时间:2019-10-29 11:34:35 ,浏览量:2

虽然自己敲了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
关注
打赏
查看更多评论

张巧龙

暂无认证

  • 2浏览

    0关注

    1164博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录