main函数里声明函数

时间:2021-03-27 21:21:56

#include <stdio.h>
//#include <stdlib.h>
#include<ctype.h>
#define MAXLINE 1000

int getline(char s[],int lim);
int strindex(char s[],char t[]);
double atof(char s[]);
main()
{

double sum,atof(char []);//为什么可以再这里声明一个函数?有什么用?
char line[MAXLINE];
int getline(char line[],int m);//为什么可以再这里声明一个函数?有什么用?
sum = 0;
while (getline(line,MAXLINE) > 0)
{
printf("\t%g\n",sum += atof(line));
}
return 0;
}
double atof(char s[])
{
double power;
double sum;
int i,sign;
for(i = 0;isspace(s[i]);++i) //跳过空格
;
sign = (s[i] == '-') ? -1 : 1; //判断符号
if(s[i] == '+' || s[i] == '-')
i++;
sum = 0.0;
power = 1.0;
while(s[i] != '.')
{
sum = sum * 10.0 + (s[i] - '0');
++i;
}
if(s[i] == '.')
i++;
while(s[i] != '\0')
{
sum = sum * 10.0 + (s[i] - '0');
power *= 10.0;
++i;
}
return sign * sum / power;
}
int getline(char s[],int lim)
{
int c;
int i,j = 0;
for(i = 0;i < lim && (c = getchar()) != EOF && c != '\n';++i)
{
s[j++] = c;
}
if (c == '\n')
{
s[j++] = c;
}
s[j] = '\0';
return j;
}
int strindex(char s[],char t[])
{
int i,j,k;
//j = k = 0;
for(i = 0;s[i] != '\0';++i)
{
for(j = i,k=0;t[k] != '\0' && s[j] == t[k];j++,k++)
;
if(k > 0 && t[k] == '\0')
return i;
}
return -1;
}

问题在上面注释里面。

16 个解决方案

#1


函数声明可以放无数份,与定义不同噢。

#2


函数声明可以放无数份,与定义不同噢。

#3


引用 1 楼  的回复:
函数声明可以放无数份,与定义不同噢。

什么意思?

#4


(1)这是C语言中的函数预定义,有些其实不是必须的,比如:
   int getline(char s[],int lim);
   只是在编译时会有告警信息。
(2)C语言中函数预定义实际上是为编译器分配一个函数类型符号,但是,分配之前必须,它必须告诉编译器函数的返回类型、参数类型等信息,只有知道这些信息的情况下,编译器才能为该符号分配相应的内存空间。
(3)如果函数是先定义,后使用,则函数预定义不是必须的。如果函数返回整形,则预定义也不是必须的。
(4)因为函数预定义其实一个变量类型符号,和变量一样,也有作用范围问题。在main内外的定义,它们的作用域是不同的,因此它们可以在不同作用域内重复定义。
(5)实际上,有些编译器在相同的作用域内也允许重复定义,比如VC如下定义也是允许的。
int TestBuf(char *);
int TestBuf(char *);

int TestBuf(char *buf)
{
return 0;
}

void main()
{
printf("TESTOF!\n");

#5


引用 1 楼  的回复:
函数声明可以放无数份,与定义不同噢。

1.定义是声明。
2.C:同一作用域内相同的tentative definition也可以多次出现。

#6


一楼正解,楼主可能想知道的是下面的情况:

#include <stdio.h>

int main(void)
{
double a = 3.0, b = 4.0, c;

double gou_gu(double x, double y)
{
return sqrt(x*x + y*y);
}

c = gou_gu(a, b);
printf("c = %.2f\n", c);

return 0;

}

这段代码在gcc里是可以编译通过的,其它编译器我没有试过。
这属于编译器的扩展,第一次见同事这么写,很惊讶。

#7


c4droid可以,open watcom不可以

#8


在开头有了函数的声明,main中有没有都无所谓了,只要在调用函数之前,让编译器知道有这个函数就行

#9


引用 6 楼 lishanchao 的回复:
一楼正解,楼主可能想知道的是下面的情况:
C/C++ code

#include <stdio.h>

int main(void)
{
    double a = 3.0, b = 4.0, c;

    double gou_gu(double x, double y)
    {
        return sqrt(x*x + y*y);
    }

    c = gou……

你同事以前多半是搞java的,不然写不出这种垃圾程序

#10


新人求解垃圾在何处···
引用 9 楼  的回复:
引用 6 楼 lishanchao 的回复:

一楼正解,楼主可能想知道的是下面的情况:
C/C++ code

#include <stdio.h>

int main(void)
{
double a = 3.0, b = 4.0, c;

double gou_gu(double x, double y)
{
return sqrt(x*x + y*y);
}
……

#11


引用 10 楼 aiqingdejian 的回复:
新人求解垃圾在何处···引用 9 楼  的回复:

引用 6 楼 lishanchao 的回复:

一楼正解,楼主可能想知道的是下面的情况:
C/C++ code

#include <stdio.h>

int main(void)
{
double a = 3.0, b = 4.0, c;

double gou_gu(double x, double y)
{
……

首先明确一点这样写有什么好处?能借用主函数里的定义变量?还是函数隐藏?如果不能,那么,增加函数复杂度的代码技巧就不能算作技巧,而是垃圾,这就像A[++i++]=b;一样,算法有问题吗?没问题,但就是垃圾代码,因为其增加了代码的维护复杂度。
Java编程如此,是因为Java在设计之初用于处理简单问题的,因此其设计的理念没有考虑到类型复杂性问题,当一个class只有几个简单的成员属性及成员函数时,这样做问题不大,而且还有趣;但这恰恰让Java只能是给工程师用的工具,因为工程师很少拷问心灵:如何写一个高效简单代码来解决复杂的算法问题。他只需要知道怎么搭积木就可以了。
但C及C++编程则不这样,自主创新、构想的东西太多,由于成员函数独立性,往往一个class会很复杂,相应的函数也会很多,如果在函数里嵌套函数的话,将会使函数变得无论可读性与可维护性都很成问题。关键在于有这么多弊端的前提下,还几乎没有什么好处,那么要这功能干吗?想表现自己很二吗?Java编程者习惯了,也就罢了,如果还羡慕,那就不动脑筋了。

#12


该回复于2012-06-12 14:54:01被版主删除

#13


预定义...

#14


声明函数有什么问题吗,后面再定义不就可以了吗····

#15


引用 6 楼  的回复:
一楼正解,楼主可能想知道的是下面的情况:
C/C++ code

#include <stdio.h>

int main(void)
{
    double a = 3.0, b = 4.0, c;

    double gou_gu(double x, double y)
    {
        return sqrt(x*x + y*y);
    }

    c = gou……


你这是嵌套定义,在标准C里面应该是不允许的,gcc能过是因为编译器自己做了扩展吧

#16


    等级:Blank


#9 得分:3 回复于: 2012-06-10 10:12:27
引用 6 楼 lishanchao 的回复:

    一楼正解,楼主可能想知道的是下面的情况:
    C/C++ code

    #include <stdio.h>

    int main(void)
    {
        double a = 3.0, b = 4.0, c;

        double gou_gu(double x, double y)
        {
            return sqrt(x*x + y*y);
        }

        c = gou……

你同事以前多半是搞java的,不然写不出这种垃圾程序 


java程序员也写不出这种垃圾,你肯定不知道Java怎么写

#1


函数声明可以放无数份,与定义不同噢。

#2


函数声明可以放无数份,与定义不同噢。

#3


引用 1 楼  的回复:
函数声明可以放无数份,与定义不同噢。

什么意思?

#4


(1)这是C语言中的函数预定义,有些其实不是必须的,比如:
   int getline(char s[],int lim);
   只是在编译时会有告警信息。
(2)C语言中函数预定义实际上是为编译器分配一个函数类型符号,但是,分配之前必须,它必须告诉编译器函数的返回类型、参数类型等信息,只有知道这些信息的情况下,编译器才能为该符号分配相应的内存空间。
(3)如果函数是先定义,后使用,则函数预定义不是必须的。如果函数返回整形,则预定义也不是必须的。
(4)因为函数预定义其实一个变量类型符号,和变量一样,也有作用范围问题。在main内外的定义,它们的作用域是不同的,因此它们可以在不同作用域内重复定义。
(5)实际上,有些编译器在相同的作用域内也允许重复定义,比如VC如下定义也是允许的。
int TestBuf(char *);
int TestBuf(char *);

int TestBuf(char *buf)
{
return 0;
}

void main()
{
printf("TESTOF!\n");

#5


引用 1 楼  的回复:
函数声明可以放无数份,与定义不同噢。

1.定义是声明。
2.C:同一作用域内相同的tentative definition也可以多次出现。

#6


一楼正解,楼主可能想知道的是下面的情况:

#include <stdio.h>

int main(void)
{
double a = 3.0, b = 4.0, c;

double gou_gu(double x, double y)
{
return sqrt(x*x + y*y);
}

c = gou_gu(a, b);
printf("c = %.2f\n", c);

return 0;

}

这段代码在gcc里是可以编译通过的,其它编译器我没有试过。
这属于编译器的扩展,第一次见同事这么写,很惊讶。

#7


c4droid可以,open watcom不可以

#8


在开头有了函数的声明,main中有没有都无所谓了,只要在调用函数之前,让编译器知道有这个函数就行

#9


引用 6 楼 lishanchao 的回复:
一楼正解,楼主可能想知道的是下面的情况:
C/C++ code

#include <stdio.h>

int main(void)
{
    double a = 3.0, b = 4.0, c;

    double gou_gu(double x, double y)
    {
        return sqrt(x*x + y*y);
    }

    c = gou……

你同事以前多半是搞java的,不然写不出这种垃圾程序

#10


新人求解垃圾在何处···
引用 9 楼  的回复:
引用 6 楼 lishanchao 的回复:

一楼正解,楼主可能想知道的是下面的情况:
C/C++ code

#include <stdio.h>

int main(void)
{
double a = 3.0, b = 4.0, c;

double gou_gu(double x, double y)
{
return sqrt(x*x + y*y);
}
……

#11


引用 10 楼 aiqingdejian 的回复:
新人求解垃圾在何处···引用 9 楼  的回复:

引用 6 楼 lishanchao 的回复:

一楼正解,楼主可能想知道的是下面的情况:
C/C++ code

#include <stdio.h>

int main(void)
{
double a = 3.0, b = 4.0, c;

double gou_gu(double x, double y)
{
……

首先明确一点这样写有什么好处?能借用主函数里的定义变量?还是函数隐藏?如果不能,那么,增加函数复杂度的代码技巧就不能算作技巧,而是垃圾,这就像A[++i++]=b;一样,算法有问题吗?没问题,但就是垃圾代码,因为其增加了代码的维护复杂度。
Java编程如此,是因为Java在设计之初用于处理简单问题的,因此其设计的理念没有考虑到类型复杂性问题,当一个class只有几个简单的成员属性及成员函数时,这样做问题不大,而且还有趣;但这恰恰让Java只能是给工程师用的工具,因为工程师很少拷问心灵:如何写一个高效简单代码来解决复杂的算法问题。他只需要知道怎么搭积木就可以了。
但C及C++编程则不这样,自主创新、构想的东西太多,由于成员函数独立性,往往一个class会很复杂,相应的函数也会很多,如果在函数里嵌套函数的话,将会使函数变得无论可读性与可维护性都很成问题。关键在于有这么多弊端的前提下,还几乎没有什么好处,那么要这功能干吗?想表现自己很二吗?Java编程者习惯了,也就罢了,如果还羡慕,那就不动脑筋了。

#12


该回复于2012-06-12 14:54:01被版主删除

#13


预定义...

#14


声明函数有什么问题吗,后面再定义不就可以了吗····

#15


引用 6 楼  的回复:
一楼正解,楼主可能想知道的是下面的情况:
C/C++ code

#include <stdio.h>

int main(void)
{
    double a = 3.0, b = 4.0, c;

    double gou_gu(double x, double y)
    {
        return sqrt(x*x + y*y);
    }

    c = gou……


你这是嵌套定义,在标准C里面应该是不允许的,gcc能过是因为编译器自己做了扩展吧

#16


    等级:Blank


#9 得分:3 回复于: 2012-06-10 10:12:27
引用 6 楼 lishanchao 的回复:

    一楼正解,楼主可能想知道的是下面的情况:
    C/C++ code

    #include <stdio.h>

    int main(void)
    {
        double a = 3.0, b = 4.0, c;

        double gou_gu(double x, double y)
        {
            return sqrt(x*x + y*y);
        }

        c = gou……

你同事以前多半是搞java的,不然写不出这种垃圾程序 


java程序员也写不出这种垃圾,你肯定不知道Java怎么写