为啥程序仅在 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 时才有效?