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

张巧龙

暂无认证

  • 1浏览

    0关注

    1208博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

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

虽然自己敲了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
关注
打赏
1665727216
查看更多评论
立即登录/注册

微信扫码登录

0.0414s