| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1598 人关注过本帖
标题:一道C题目引出来的困惑.
只看楼主 加入收藏
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:24 
一道C题目引出来的困惑.
明白形参传递,  但是我有另外困惑,红色的int a=2应该是全局变量.当调用f(int *a)时return (*a)++ 返回的结果应该是2吧?        谢谢!
 

#include<stdafx.h>
 #include"stdio.h"
int a=2;
 int f(int *a)
 {
      return (*a)++;
 }
 void main()
 {
      int s=0;
      {
          int a=5;
          s+=f(&a);
      }
      printf("%d\n",s);
      s+=f(&a);
      printf("%d\n",s);
 }
搜索更多相关主题的帖子: include return 
2012-07-07 11:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
私有变量的优先级比全局高,调用s+=f(&a)之前,花括号定义的是int a=5,整个花括号内都使用这个局部变量,外面的全部同名变量被屏蔽。

授人以渔,不授人以鱼。
2012-07-07 11:44
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:3 

#include<stdafx.h>
#include"stdio.h"
int a=2;
int f(int *a)
{
      return (*a)++;
}
void main()
{
      int s=0;
      {
          int a=5;
          s+=f(&a);
      }
      printf("%d\n",s);
      s+=f(&a);
      printf("%d\n",s);
}
你的 int f(int *a) 都没有定义就调用了???(这样定义(int f(int *)在main()函数外和main()函数内够可以)
2012-07-07 12:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 楼主 wangchengbin
这段程序输出的结果是5,7

分析代码:定义了全局变量int a = 2之后,main()函数int s = 0下面有一对花括号,这在C++中意味着是一个局部代码块,相当于一个内部未命名函数,在这个块体如果定义了变量,其作用域就在这个块内,也是局部变量。因此,此处重新定义了一个局部变量int a = 5,与前面的全局变量a虽然同名,但不是同一个变量(在编译之后,汇编码中可以看到这是不同的变量),这与你在main()再定义一个int a屏蔽全局变量a是一样的道理。在这个块中,调用f(&a)返回5,s += 5的结果是s = 5。局部块结束,s = 5被带出,此时main()内使用的是全局变量a = 2,再执行一次f(&a)返回2,s += 2的结果是7。这就是运行结果的解释。

授人以渔,不授人以鱼。
2012-07-07 13:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在C99和C++中,容许你写下面的代码:
程序代码:
for (int i = 0; i < 10; ++i)
{
}

在这里,i的作用域在for()循环内,是局部变量,在循环前后都是不可见的,如果在for()之前存在任意的i变量,都被屏蔽。这与1楼代码的原理是一样的。BASIC语言中,有PRIVATE变量声明,也是起这种作用,这个语句的意思是屏蔽外部变量(但并不定义变量,因为BASIC的变量是不用定义就可以使用的)。

[ 本帖最后由 TonyDeng 于 2012-7-7 13:37 编辑 ]

授人以渔,不授人以鱼。
2012-07-07 13:35
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 5楼 TonyDeng
  请帮忙看一下为什么以下程序在运行的时候老是出错,显示: “malloc”: 找不到标识符 !
#include<stdafx.h>
#include<stdio.h>
void getmemory(char *p)
{
  p=(char *) malloc(100);
}
void test(void)
{
    char *str=NULL;
    getmemory(str);
    strcpy(str,"hello world");
    printf(str);
}
2012-07-08 09:36
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 5楼 TonyDeng
知道为什么了,是少了个#include<stdlib.h>头文件.  另外,我这程序为什么输出不了结果啊?  我想知道红色部分结果.
我试着用puts(str); printf("%s",str);都得不到结果了            ???
#include<stdafx.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void getmemory(char *p)
{
  p=(char *) malloc(100);
}
void main(void)
{
    char *str=NULL;
    getmemory(str);
    strcpy(str,"hello world");
    printf(str);
}
2012-07-08 09:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
动态分配了内存,当你作为字符串使用的时候,要记得用'\0'作结束符。

授人以渔,不授人以鱼。
2012-07-08 10:27
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 8楼 TonyDeng
那咱处理啊?

我只想知道strcpy(str,"hello world"); 之后 str 输出结果.
2012-07-08 10:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
问题就出在strcpy()上,两个字符串拼接,你的str没有结束符,操作不成功。

授人以渔,不授人以鱼。
2012-07-08 10:35
快速回复:一道C题目引出来的困惑.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037359 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved