一道面试题
#include <stdio.h>
main()
{
a();
b();
c();
}
a()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
b()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
c()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
请问这道程序错在哪里?为什么
问题点数:20、回复次数:28Top
1 楼julysnowcn(julysnow)回复于 2005-03-05 10:34:15 得分 0
我知道错在哪里了,错在主考官的脑袋了.程序本身没什么错误,只是有些不符合规范,但也可以编译并正确运行.Top
2 楼shuihan84(shuihan84)回复于 2005-03-05 10:53:43 得分 0
楼上的大哥这程序能通过编译??
你用的什么超强编译器啊?:-)
至少该程序有一下几个错!!
1:函数没有在使用前先声明!这是绝对通不过编译的!!
2:下面函数没有返回类型(包括main)至少该改成void a(),虽然不写也是正确的但这完全不符合规范!在有的编译器下可能不能通过编译!
另外始终觉得那3个静态变量不大对劲,还望高手解释解释这种做法不爽的地方!:-)Top
3 楼syd1207(既然选择远方,便只顾风雨兼程。。。)回复于 2005-03-05 10:58:35 得分 0
a() b() c()都没有声明!Top
4 楼syd1207(既然选择远方,便只顾风雨兼程。。。)回复于 2005-03-05 11:01:01 得分 0
#include <stdio.h>
void a();
void b();
void c();
int main()
{
a();
b();
c();
return 0;
}
void a()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
void b()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
void c()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
Top
5 楼godenwang1848(上帝的爱人)回复于 2005-03-05 11:03:06 得分 0
他编译的时候我在旁边看着就是可以啊,而且表明局部静态变量对程序没有影响,我们还专门把static int x=0;
改成了,static int x;
结果就是能正确编译啊,我在dev c++里边也能正确编译Top
6 楼utstar(Universal Light)回复于 2005-03-05 14:00:35 得分 0
c程序可以不事先声明,也可以没有返回值
Top
7 楼languagec(各有所求)回复于 2005-03-05 14:52:29 得分 5
程序本身没有错,在tc 下编译是可以通过的,VC6 下需要声明函数类型
静态变量没有初始化都默认为0,所以函数都输出1Top
8 楼shuihan84(shuihan84)回复于 2005-03-05 15:11:10 得分 0
哦?可以不事先声明??
学习ingTop
9 楼linhai1978(林)回复于 2005-03-05 17:02:11 得分 0
我觉得是静态变量用的有问题,因为在c中的静态变量外部是看不到的;而c++中表示的静态变量只是表示值是静态的.还有希望大家看程序之后最好调试一下.那样会清楚很多.程序编译可以通过的.Top
10 楼linhai1978(林)回复于 2005-03-05 17:04:00 得分 0
当时面试官问我x在内存中是怎么样的.我闷了~郁闷呀~本人不太了解内存~Top
11 楼lunarking(工工)回复于 2005-03-05 19:41:24 得分 0
K&R c 是能编译的, ANSI C是不能编译的,老大,人家其实是想问你static的用法.你好好看看书吧.Top
12 楼utstar(Universal Light)回复于 2005-03-05 20:32:14 得分 0
c编译器应该都能编译,否则就是不符合标准.c++编译器不能通过Top
13 楼packer(宇)回复于 2005-03-05 20:50:20 得分 0
ding
Top
14 楼sct()回复于 2005-03-05 20:56:12 得分 0
来看看高手们如何解答Top
15 楼gcg50290395()回复于 2005-03-05 21:12:57 得分 0
如果不声明,要写在主函数的前面才可以,最好是先声明。Top
16 楼onepence(分文不值)回复于 2005-03-05 21:30:46 得分 0
是不是static 变量x不在堆上,也不在栈上,而是在专门存储静态变量和全局变量的区域中啊。Top
17 楼wgb1314(wgb1314)回复于 2005-03-05 22:35:26 得分 0
此程序用VC++可通过,结果:111
只是有6个warnings:3个函数没有声明,没有返回值。
3个局部静态变量并无问题,它们互不影响。/Top
18 楼hjy82919(水心)回复于 2005-03-05 22:39:48 得分 5
static的生存期将延续到整个程序的终止.在内存数据区分配空间,在整个程序运行过程中不再释放.多次运行事更改,只维持原状,不再做赋初值操作.所以X=0Top
19 楼hpu8510(赫赫)回复于 2005-03-06 10:33:41 得分 0
static是静态变量,它在内存中是存在静态存储区的,所谓静态存储就是指在程序运行期间分配固定的存储空间的方式。静态变量的值在函数调用结束后不消失而保留原值。Top
20 楼jinqingli109()回复于 2005-03-06 11:41:11 得分 0
在c编译器编译器中可以调试运行
静态变量 不是该程序的错误之处
具体错在那我也不知道
Top
21 楼xl5338870(xlix)回复于 2005-03-06 11:58:53 得分 5
1。静态变量是编译期决定的,放在.data节中,初始化是由c运行时执行的,不同于局部变量。
2。函数中的静态变量作用域只限于该函数内部。
3。这三个函数中的静态变量不同,也就是有三个。Top
22 楼jack0369(木头)回复于 2005-03-06 12:57:04 得分 0
赞同:
syd1207(小虫)
#include <stdio.h>
void a();
void b();
void c();
int main()
{
a();
b();
c();
return 0;
}
void a()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
void b()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
void c()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
Top
23 楼zjraycj(无名)回复于 2005-03-06 13:17:13 得分 0
在老式的C程序中,可以不用声明函数,默认为int型。static修饰的局部变量无须初始化,默认值为0,而且只初始化一次,以后再用到的话就是该变量最后一次所存储的值,直到程序结束才释放。3个X在内存中分别占用三个位置,互不相干。不过最好在函数中有一个return语句,因为函数已经默认为返回一个整形值了。Top
24 楼utstar(Universal Light)回复于 2005-03-06 13:36:53 得分 5
不是老式不老式的问题,因为历史原因,最新的c99标准也是允许不用声明函数的,否则将会break难以计数的c程序。比如下面的程序用gcc -std=c99一样可以编译通过,只不过有几个warning而已
main()
{
f1();
}
f1(int p1)
{
}Top
25 楼liangyouyi(阿虎)回复于 2005-03-06 13:56:16 得分 0
我同意楼上的关于有三个静态变量的说法,函数体内的静态变量屏蔽了外面的静态变量,所以这个程序中其实有3个静态变量!Top
26 楼flying_dancing(小混混-_-)回复于 2005-03-06 18:29:07 得分 0
#include <iostream>
using namespace std;
void a();
void b();
void c();
void main()
{
a();
b();
c();
}
void a()
{
static int x=0;
if(x==0)
{
x=1;
}
cout<<x<<endl;
}
void b()
{
static int x=0;
if(x==0)
{
x=1;
}
cout<<x<<endl;
}
void c()
{
static int x=0;
if(x==0)
{
x=1;
}
cout<<x<<endl;
}
原本程序有问题,上面说的也有道理......我同意:静态的有固定的存储空间Top
27 楼qifa(DoItNow)回复于 2005-03-07 14:54:01 得分 0
静态变量是存放在数据区的Top
28 楼VxD1(Dump)回复于 2005-03-07 15:03:23 得分 0
#include <stdio.h>
void a()
{
static int x=0;
if(x==0)
{
x=1;
}
printf("%d",x);
}
void b()
{
if(x==0)
{
x=1;
}
printf("%d",x);
}
void c()
{
if(x==0)
{
x=1;
}
printf("%d",x);
}
void main()
{
a();
b();
c();
}
Top




