为啥程序仅在 main 中定义时才给出输出(以及如何更改它)?

Posted

技术标签:

【中文标题】为啥程序仅在 main 中定义时才给出输出(以及如何更改它)?【英文标题】:Why does the program only give an output if defined in main (and how can I change this)?为什么程序仅在 main 中定义时才给出输出(以及如何更改它)? 【发布时间】:2018-08-28 14:05:17 【问题描述】:

我试图运行它

int array( void )

    char text[12] =   112, 114, 111, 103, 112, 0 ;
    int i;
    for(i = 0; text[i]; i = i +1)
        printf("%c", text[i]);
    printf("\n");
    return 0;


int main( void )

    int array(void);
    return 0;

程序运行,但我没有得到任何结果。现在当我使用 main 函数来定义程序时:

int main( void )

    char text[12] =   112, 114, 111, 112, 0 ;
    int i;
    for(i = 0; text[i]; i = i +1)
        printf("%c", text[i]);
    printf("\n");
    return 0;

我得到了结果progr(根据需要)。我已经搜索过,但我发现的唯一相关问题是关于使用 main 作为函数名和错误的输出。也许我正在寻找错误的方式,但如果有人能回答这个问题,我会很高兴。

【问题讨论】:

尝试从int array(void); 中删除int int array(void); 只是一个原型 - 它不调用函数。拨打电话:array() 至少可以说是原始错字。 大概你知道你可以通过使用char text[12] = 'p', 'r', 'o', 'g', 'p', 0 ;(或者,当然,char text[12] = "progp";)使你的代码更具可读性。 请不要使用幻数。该数组应该是char text[12] = 'p', 'r', 'o', 'g', 'p', 0 );,但更好的是char text[12] = "progp";(@SteveSummit 使用了另一个 sn-p(直到编辑))。 【参考方案1】:

正如问题中的 cmets 所述,而不是这个......

int main(void)

  int array(void);
  return 0;

你应该改写

int main(void)

  array(void);
  return 0;

这是因为当说int something(); 时,您声明了一个名为something 的函数的原型,它不接受任何参数并返回一个int。相反,您只需键入 something(); 即可调用该函数。

【讨论】:

我确定您的意思是他在 声明,而 defining 表示作用域之间的函数的实际主体。【参考方案2】:

既然函数返回int,你也应该把它的返回值赋给int 你可以只用它的名字正常调用它,因为它总是返回一个0 常量。

int i = array(); // i = 0
// or
array();

只是打印,其值始终为0。 然后我建议改为void,因为您只需要按名称调用它。

#include <stdio.h>
void array()

    char text[12] =   112, 114, 111, 103, 112, 0 ;
    for(int i = 0; text[i]; i++)
        printf("%c", text[i]);
    printf("\n");

int main()

    array();
    return 0;

注意,您不能将类型 void 分配给任何东西。

【讨论】:

嗯,我知道,但是他的函数无论如何都与返回值无关,所以只是打印,我没有说担心返回值而是改进他的代码,i = i +1 >> i++,也不需要在任何地方输入void,因为编译器已经足够聪明,可以优化它。【参考方案3】:

你的直接问题是你没有调用函数array,你 declare 它在 main 的体内。 声明本身不执行代码。

函数声明告诉编译器函数的名称、返回类型和参数。

函数定义提供函数的实际主体。

定义函数

C语言中函数定义的一般形式如下

return_type function_name( parameter list ) 
   body of the function

在您的情况下,您有两个函数定义:

// 1.
int array( void )

    char text[12] =   112, 114, 111, 103, 112, 0 ;
    int i;
    for(i = 0; text[i]; i = i +1)
        printf("%c", text[i]);
    printf("\n");
    return 0;


// 2.
int main(void)

    //...
    return 0;

函数声明

函数声明告诉编译器函数名称以及如何调用函数。函数的实际主体可以单独定义。

int array(void); // function declaration, no parameters, returns int value 

调用函数

要调用函数,只需要传递所需的参数和函数名,如果函数返回值,则可以存储返回值。

在你的情况下这样称呼它:

 array();

因为没有要传递的参数。

总结一下:

int array(void);   // function declaration, no parameters, returns int value 

int array(void)    // definition of the function `array`
   
    // function body
    char text[12] =   112, 114, 111, 103, 112, 0 ;
    // ...
    return 0;
   

int main(void)    // definition of the function `main`, 

  array();        // function call, calling function `array` with no parameters
  return 0;

【讨论】:

非常感谢您提供如此广泛的信息【参考方案4】:

main 内部的int array(void); 只是一个声明。您告诉编译器您在其他地方有一个名为array 的函数,它不接受任何参数,也不返回任何内容。但在任何情况下都不会在 main 上调用 array 函数。要调用它,只需将声明更改为如下语句:

int main()

     int array(void); // you tell compiler that you have a function array.
     array();  // you are executing the code of array();
     return 0;

【讨论】:

以上是关于为啥程序仅在 main 中定义时才给出输出(以及如何更改它)?的主要内容,如果未能解决你的问题,请参考以下文章

PWA:为啥导航到 URI 仅在 URI 在 PWA 的清单中注册时才有效

为啥 Thread.Abort 仅在 isBackground 属性设置为 true 时才有效?

为啥提交按钮仅在我的示例中按下两次时才起作用?

为啥 VS 2010 Intellisense 仅在我安装了视觉辅助 X 时才有效?

为啥 Angular Oninit 仅在离开页面时才调用服务

为啥我的 C# Xml 代码仅在我枚举变量 enumerable 时才有效