鱼C论坛

 找回密码
 立即注册
查看: 10974|回复: 41

求帮俺解释下这个很蛋疼的问题?

  [复制链接]
发表于 2012-6-28 19:36:21 | 显示全部楼层 |阅读模式
5鱼币
#define FUCK_STATIC(x) *(&x+1) = 0

int fun(int m)
{
        static int p = m;

        FUCK_STATIC(p);

        return p++;
}
int main(int argc, char* argv[])
{
        int a[10];
        for(int i = 0; i < 10; i++)
        {
                 a[i] = fun(10);
        }

        printf("%d", fun(1));
        return 0;
}
为什么打印的结果会是1?  这如何解释,但是去掉fun函数里面那个宏以后,就正常了。。。

最佳答案

查看完整内容

1. 这位仁兄?宏怎么能是只是用来定义数字呢? 你到底有没有接触过编程? 带参宏没用过吗?定义数字只是宏最基本的用法而已。 宏更强大的用法在于带参宏。 例如c库里面自己定义的变参宏va_start va_arg va_end。。。你可以去看看这几个宏的定义。好好学习下。宏应该怎么用。这样,你以后在接触学习类似与MFC 等其他库的时候,不至于看不懂人家在干嘛。因为这些库里面包含大量强大的宏。 2. 怎么能说一开始把p赋值给m。就说这 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-28 19:36:22 | 显示全部楼层

1.  这位仁兄?宏怎么能是只是用来定义数字呢? 你到底有没有接触过编程? 带参宏没用过吗?定义数字只是宏最基本的用法而已。 宏更强大的用法在于带参宏。 例如c库里面自己定义的变参宏va_start  va_arg va_end。。。你可以去看看这几个宏的定义。好好学习下。宏应该怎么用。这样,你以后在接触学习类似与MFC 等其他库的时候,不至于看不懂人家在干嘛。因为这些库里面包含大量强大的宏。
2. 怎么能说一开始把p赋值给m。就说这个静态变量没有用呢? 这里虽然刚进来就给静态变量赋值了。 但是,这个赋值代码只有在这个函数第一次被执行的时候才会执行。再次调用这个函数的时候, 赋值代码是不会被执行的。 这是静态变量的基本特性。
3. 你说编译不过? 楼主都说了。 用.cpp文件。你用的是.c文件,的确编译不过。
4. 这个题目按照正常静态变量的特性。结果应该是20. 但是如果加了那条宏以后。结果会成1. 至于有些人测试结果依然是20的。 不妨可以把#define FUCK_STATIC(x) *(&x+1) = 0改为#define FUCK_STATIC(x) *(&x-1) = 0试试。
5. 楼主的想搞明白我想应该是:按照静态变量值初始化一次的特性, 这个题目的结果应该是20. 为什么添加了这个宏以后。 破坏了这一特性。造成静态变量每次进入函数都进行初始化。
6. 最后,如果你搞懂了这个宏。那么你就真正能理解静态局部变量的本质了。

  

评分

参与人数 2荣誉 +5 鱼币 +7 贡献 +5 收起 理由
丿夏夜灬彬刂 + 5 + 5 + 5
Tzdner_C + 2 很给力!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 19:53:43 | 显示全部楼层
我的处女贴,就这样给你了.    :$:$:$
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-28 20:16:52 | 显示全部楼层
半斤八兩 发表于 2012-6-28 19:53
我的处女贴,就这样给你了.

你要是说个“我的处女身”。。。叫我以后还如何在论坛混?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-29 09:25:17 | 显示全部楼层
Tzdner_C 发表于 2012-6-28 20:16
你要是说个“我的处女身”。。。叫我以后还如何在论坛混?

:'(没人回帖。。。、、。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-29 17:07:27 | 显示全部楼层
亲,不晓得你是用的啥编译器,,在我这根本编译不过啊。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-29 17:13:24 | 显示全部楼层
chao_prince 发表于 2012-6-29 17:07
亲,不晓得你是用的啥编译器,,在我这根本编译不过啊。。

:L   我用的VC6.0 啊    你在前面加的是 #include "stdafx.h"  吗?  报什么编译错误给我说下,我这边没有问题的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-29 18:04:49 | 显示全部楼层
#include "stdafx.h" 是什么头文件哦  还没学到0.0  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-29 18:10:06 | 显示全部楼层
丿夏夜灬彬刂 发表于 2012-6-29 18:04
#include "stdafx.h" 是什么头文件哦  还没学到0.0

建立的.cpp文件的话就用的这个头文件,建立的.c文件就用的#include <stdio.h>,其实一样的,都是为了。。。没什么学不学的了、、、
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-29 18:12:50 | 显示全部楼层
Tzdner_C 发表于 2012-6-29 18:10
建立的.cpp文件的话就用的这个头文件,建立的.c文件就用的#include ,其实一样的,都是为了。。。没什么学 ...

建立cpp 不是用 #include<iostream> 吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-29 18:53:35 | 显示全部楼层
丿夏夜灬彬刂 发表于 2012-6-29 18:12
建立cpp 不是用 #include 吗

如果你建立的.cpp文件,输入输出还是用的printf,那么就得用#include "stdafx.h"这个头文件里面包含的stdio.h  就是说包含的C 语言的输入输出库函数,也就是说建立的C++的文件,却写的C代码。。。我一直这样整的。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-29 19:10:23 | 显示全部楼层
哦  明白了 thanks :lol:lol
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-29 21:23:06 | 显示全部楼层
Tzdner_C 发表于 2012-6-29 17:13
我用的VC6.0 啊    你在前面加的是 #include "stdafx.h"  吗?  报什么编译错误给我说下,我这边没有 ...

我试过好几个编译器,VS2010(命令行下), CODEBLOCK。。
最后我用了VC6.0还是错。。
test.c(7) : error C2099: initializer is not a constant
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-29 21:46:27 | 显示全部楼层
在VC6.0下输出的结果是20啊!有什么问题???:lol
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-29 23:38:26 | 显示全部楼层
螃蟹009 发表于 2012-6-29 21:46
在VC6.0下输出的结果是20啊!有什么问题???

   真的 ?              难道我的VC6有问题?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-29 23:46:00 | 显示全部楼层
chao_prince 发表于 2012-6-29 21:23
我试过好几个编译器,VS2010(命令行下), CODEBLOCK。。
最后我用了VC6.0还是错。。
test.c(7) : erro ...

那你复制代码的时候复制错了。。。还有是不是把宏写在头文件的前面饿。。。看你楼下已经在VC6试过了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-30 09:28:44 | 显示全部楼层
大哥  宏定义 不是你这样 玩的!  你为何 要这样 看不清楚! 而且 新手 不推荐 用宏 看的 不清晰!还有宏 一般都是 定义数字 的! 以后要 约定玩!这样玩 只会让你 特立独行! 还有 你玩的静态变量! 一开始你就把P的值用M 覆盖了 所以说 你这个 静态变量 一点用 都没有!再说回宏定义  (x) *(&x+1) = 0(p) 我实在看不懂 用宏定义 替换后 这样的怪物 有什么用!还有你的用意是什么!这尼玛 更本编译不过!我也不知道 我说的是对是错!只求不喷!等我朋友上线 我让他也帮你看看!这尼玛年轻人啊!真能玩!你是不是把编译器给 XX了 才能编译过啊!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-30 09:30:24 | 显示全部楼层
丿夏夜灬彬刂 发表于 2012-6-29 18:12
建立cpp 不是用 #include 吗

没说 建立CPP 就要用 C 写  C++ 兼容 C 你不知道么!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-30 09:31:03 | 显示全部楼层
Tzdner_C 发表于 2012-6-28 20:16
你要是说个“我的处女身”。。。叫我以后还如何在论坛混?

define  好像 只能用作 替换的意思 !你自己替换后看看!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-30 09:46:56 | 显示全部楼层
新手表示看不懂,那头文件是啥?我直接复制你的,编辑器说有8处错误:L
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-14 01:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表