辨析主函数:main()void main()int main()int main(void)int main(int argc, char argv[])之间的区别

合集下载

函数大全(m开头)

函数大全(m开头)

函数大全(m开头)main()主函数每一C 程序都必须有一main()函数, 可以根据自己的爱好把它放在程序的某个地方。

有些程序员把它放在最前面, 而另一些程序员把它放在最后面, 无论放在哪个地方, 以下几点说明都是适合的。

1. main() 参数在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env。

* argc: 整数, 为传给main()的命令行参数个数。

* argv: 字符串数组。

在DOS 3.X 版本中, argv[0] 为程序运行的全路径名; 对DOS 3.0以下的版本, argv[0]为空串("") 。

argv[1] 为在DOS命令行中执行程序名后的第一个字符串;argv[2] 为执行程序名后的第二个字符串;...argv[argc]为NULL。

*env: 安符串数组。

env[] 的每一个元素都包含ENVV AR=value形式的字符串。

其中ENVV AR为环境变量如PA TH或87。

value 为ENVV AR的对应值如C:\DOS, C: \TURBOC(对于PATH) 或YES(对于87)。

Turbo C2.0启动时总是把这三个参数传递给main()函数, 可以在用户程序中说明(或不说明)它们, 如果说明了部分(或全部)参数, 它们就成为main()子程序的局部变量。

请注意: 一旦想说明这些参数, 则必须按argc, argv, env 的顺序, 如以下的例子:main()main(int argc)main(int argc, char *argv[])main(int argc, char *argv[], char *env[])其中第二种情况是合法的, 但不常见, 因为在程序中很少有只用argc, 而不用argv[]的情况。

以下提供一样例程序EXAMPLE.EXE, 演示如何在main()函数中使用三个参数:/*program name EXAMPLE.EXE*/#include <stdio.h>#include <stdlib.h>main(int argc, char *argv[], char *env[]){int i;printf("These are the %d command- line arguments passed tomain:\n\n", argc);for(i=0; i<=argc; i++)printf("argv[%d]:%s\n", i, argv[i]);printf("\nThe environment string(s)on this system are:\n\n");for(i=0; env[i]!=NULL; i++)printf(" env[%d]:%s\n", i, env[i]);}如果在DOS 提示符下, 按以下方式运行EXAMPLE.EXE:C:\example first_argument "argument with blanks" 3 4 "last butone" stop!注意: 可以用双引号括起内含空格的参数, 如本例中的: " argumentwith blanks"和"Last but one")。

c语言main函数

c语言main函数

c语言main函数C语言是一门广泛使用的编程语言,它的主要特点是简单易学、功能强大、易于移植等等。

而在C语言中,main函数则是最为重要的部分之一。

本文将详细介绍C语言中的main函数,包括其定义、作用、参数、返回值等等。

一、main函数的定义在C语言中,main函数是程序的入口点,也就是程序执行的第一个函数。

它的定义方式如下:```int main(int argc, char *argv[]){// 函数体return 0;}```其中,int表示函数返回值的类型,main表示函数名,括号中的两个参数分别是整型变量argc和字符型指针变量argv[]。

大括号内是函数的具体实现。

二、main函数的作用main函数是程序的起点,它的作用是为程序提供一个执行的入口。

当程序运行时,操作系统会调用main函数,并执行其中的代码。

因此,main函数的作用是初始化程序,分配内存空间,读取输入数据,处理逻辑等等。

三、main函数的参数在main函数中,argc和argv[]是两个重要的参数。

它们分别表示命令行参数的个数和具体的参数列表。

argc是一个整型变量,用于记录命令行参数的个数。

例如,如果在命令行中输入了“./program arg1 arg2 arg3”,那么argc的值就为4,因为除了程序名之外,还有三个参数。

argv[]是一个字符型指针数组,用于存储具体的命令行参数。

例如,如果在命令行中输入了“./program arg1 arg2 arg3”,那么argv[0]的值就是程序名“./program”,argv[1]的值是“arg1”,argv[2]的值是“arg2”,argv[3]的值是“arg3”。

四、main函数的返回值在C语言中,main函数的返回值是一个整型值。

它表示程序的执行结果,通常有以下两种情况:1. 返回0:表示程序执行成功,没有错误发生。

2. 返回非0值:表示程序执行失败,发生了某些错误。

C语言之Main函数返回值问题分析

C语言之Main函数返回值问题分析

C语言之Main函数返回值问题分析C语言之Main函数返回值问题分析:很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。

C/C++ 中从来没有定义过void main( ) 。

C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C.( void main( ) 从来就不存在于 C++ 或者 C )。

下面我分别说一下 C 和C++ 标准中对 main 函数的定义。

“The C programming Language(《C 程序设计语言》)用的就是main( )。

”--- 这是因为第一版的C语言只有一种类型,那就是int,没有char,没有long,没有float,…………既然只有一种类型,那么就可以不写,后来的改进版为了兼容以前的代码于是规定:不明确标明返回值的,默认返回值为int,也就是说 main()等同于int main(),而不是等同于void main()。

在C99中,标准要求编译器至少给 main() 这种用法来个警告。

1. C在 C89 中,main( ) 是可以接受的。

Brian W. Kernighan 和Dennis M. Ritchie 的经典巨著 The C programming Language 2e(《C 程序设计语言第二版》)用的就是 main( )。

不过在最新的 C99 标准中,只有以下两种定义方式是正确的:int main( void )int main( int argc, char *argv[] )(参考资料:ISO/IEC 9899:1999 (E) Programming languages — C 5.1.2.2.1 Program startup)当然,我们也可以做一点小小的改动。

2022年贵州师范大学公共课《C语言》科目期末试卷A(有答案)

2022年贵州师范大学公共课《C语言》科目期末试卷A(有答案)

2022年贵州师范大学公共课《C语言》科目期末试卷A(有答案)一、填空题1、设有char a,b;若要通过a&b运算屏蔽掉a中的其他位,只保留第2和第8位(右起为第1位),则b的二进制数是_______。

2、在C语言源程序中,一个变量代表【】。

3、一个C语言源程序由若干函数组成,其中至少应含有一个________4、在C语言中,用关键字_______定义单精度实型变量,用关键字_______定义双精度实型变量,用关键字_______定义字符型变量。

5、若a是int型变量,则执行表达式a=25/3%3后a的值为_______6、请填空:建立如图所示存储结构所需的说明语句是_______。

建立如图所示为变量a输入数据的输入语句是_______。

建立如图所示存储结构所需的赋值语句是_______。

7、下面程序段是找出整数的所有因子。

请填空。

scanf("%d",&x);i=1;for(;_______;){if(x%i==0)printf("%3d",i);i++;}8、已有定义int a;float b,x;char cl,c2;为使a=3、b=6.5、x=12.6、cl='a'、c2='A',正确的scanf函数调用语句是_______,数据输入的形式应为_______。

9、设有一输入函数scanf("%d”,k);它不能使float类型变量k得到正确数值的原因是_______未指明变量k的地址和_______格式控制符与变量类型不匹配。

10、设有如下定义:#define SWAP(T,X,Y){T=X;X=Y;Y=T;}以下程序段将通过调用宏实现变量x和y内容的交换,请填空。

Double x=2.5,y=6.4,z;SWAP(_______);二、选择题11、若有定义语句:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是( )。

博图main主函数input

博图main主函数input

博图main主函数input
Main()主函数:
在C/C+ 里面关于主函数main函数的定义时,大多时候我们采用的是int main(void)这种形式,不用带参数;但是标准的定义一般有两种格式:
int main(int argc,char *argv[]);
int main(int argc,char **argv);
参数说明:
argc表示传送主函数参数的个数;
argv[]:指向字符串的指针数组,其中argv[0]是命令本身,也就是程序本身,每个参数用空格隔开;
关于指针数组:表示该数组的所有元素都是指针。

input()函数:
在Python3中,input()函数接受一个标准输入数据,返回为string类型。

注意:在Python3中,raw_input()和input()进行了整合,去除了raw_input(),仅保留了input()函数,其接收任意任性输入。

将所有输入默认为字符串处理,并返回字符串类型。

关于main函数的定义

关于main函数的定义

关于main函数的定义很多⼈甚⾄市⾯上的⼀些书籍,都使⽤了void main( ),其实这是错误的。

C/C++中从来没有定义过void main( )。

C++之⽗Bjarne Stroustrup在他的主页上的FAQ中明确地写着The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C.( void main( )从来就不存在于C++或者C)。

下⾯我分别说⼀下C和C++标准中对main函数的定义。

⼀、 C语⾔中的main() 在C89中,main( )是可以接受的。

Brian W. Kernighan和Dennis M. Ritchie的经典巨著The C programming Language 2e(《C 程序设计语⾔第⼆版》)⽤的就是main( )。

不过在最新的C99标准中,只有以下两种定义⽅式是正确的: int main(void) int main(int argc, char *argv[]) (参考资料:ISO/IEC 9899:1999 (E) Programming languages ? C 5.1.2.2.1 Program startup) 当然,我们也可以做⼀点⼩⼩的改动。

例如:char *argv[]可以写成char **argv;argv和argc可以改成别的变量名(如intval和charval),不过⼀定要符合变量的命名规则。

如果不需要从命令⾏中获取参数,请⽤int main(void);否则请⽤int main(int argc, char *argv[])。

main函数的返回值类型必须是int,这样返回值才能传递给程序的调⽤者(如操作系统)。

如果main函数的最后没有写return语句的话,C99规定编译器要⾃动在⽣成的⽬标⽂件中(如exe⽂件)加⼊return 0;,表⽰程序正常退出。

2022年江汉大学公共课《C语言》科目期末试卷B(有答案)

2022年江汉大学公共课《C语言》科目期末试卷B(有答案)

2022年江汉大学公共课《C语言》科目期末试卷B(有答案)一、填空题1、设有一输入函数scanf("%d”,k);它不能使float类型变量k得到正确数值的原因是_______未指明变量k的地址和_______格式控制符与变量类型不匹配。

2、一个C语言源程序由若干函数组成,其中至少应含有一个________3、在C语言源程序中,一个变量代表【】。

4、假设m是一个3位数,从左到右依次用a、b、c表示各位的数字,则从左到右各位数字是b、a、c的3位数的表达式是_______。

5、运算符%两侧运算量的数据类型必须都是_______;运算符++和一一的运算量必须是_______。

6、把int类型变量low中的低字节及变量high中的高字节放入变量s中的表达式是_______。

7、下面程序段的运行结果是_______。

x=2;do{printf("*");x--;)while(!x==0);8、字符串"ab\n\\012\\\"”的长度是_______。

9、若有定义floata[3][5];则a数组所含数组元素个数是_______,a数组所占的字节数是_______。

10、请填空:建立如图所示存储结构所需的说明语句是_______。

建立如图所示为变量a输入数据的输入语句是_______。

建立如图所示存储结构所需的赋值语句是_______。

二、选择题11、若有定义语句:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是( )。

A.2.500000B.2.750000C.3.500000D.0.000 00012、设以下变量均为int类型,则值不等于7的表达式是( )。

A.(x=y=6,x+y,x+1)B.(x=y=6,x+y,y+1)C.(x=6,x+1,y=6,x+y)D.(y=6,y+1,x=y,x+1)13、以下叙述正确的是A.在C程序中,main函数必须位于程序的最前面B.C程序的每行中只能写一条语句C.C语言本身没有输入输出语句D.在对一个C程序进行编译的过程中,可以发现注释中的拼写错误14、一个C程序的执行是从()A.本程序的main函数开始,到main函数结束B.本程序的第一个函数开始,到本程序文件的最后一个函数结束C.本程序的main函数开始,到本程序文件的最后一个函数结束D.本程序的第一个函数开始,到本程序main函数结束15、下面是对数组s的初始化,其中错误的语句是()。

int main在c语言中的用法

int main在c语言中的用法

int main在c语言中的用法在C语言中,int main是一个特殊的函数,用于定义程序的入口点。

在程序运行时,操作系统会首先调用int main函数来执行程序中的代码。

int main函数的定义通常为:```cint main() {// 程序代码return 0;}```在int main函数中,我们可以编写程序的主要逻辑代码。

这些代码将按照顺序执行,直到遇到return语句为止。

int main函数中的int表示函数的返回类型,这里返回的是整数类型。

main函数通常会返回一个整数值,这个整数值用于向操作系统传递程序的执行结果。

返回0通常表示程序正常执行完成,其他非零值则表示程序发生了某种错误或异常情况。

通常情况下,main函数不接受任何参数。

但是在一些特定的情况下,我们可以通过命令行参数来传递给main函数。

例如:```cint main(int argc, char *argv[]) {// 程序代码return 0;}```这种形式的int main函数接受两个参数:argc和argv。

argc表示命令行参数的个数,argv是一个指向字符串数组的指针,每个字符串代表一个命令行参数。

这样我们就可以通过命令行传递参数给程序。

在int main函数中,我们可以使用各种C语言的语法和函数,来实现程序的逻辑。

例如,我们可以使用条件语句、循环语句、函数调用等来完成各种任务。

总结一下,在C语言中,int main函数是程序的入口点,用于定义程序的主要逻辑。

它的返回值类型是整数,通常返回0表示程序正常执行完成。

在一些情况下,可以通过命令行参数来传递给main函数。

我们可以在main函数中编写具体的程序代码,利用C语言提供的各种语法和函数来完成各种任务。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

“void main与int main之间的区别是什么?”这是一个常见的问题。

这个faq就是来探讨一下这个问题,并深入研究一些有关main()函数不同版本的更多的东西。

C与C++在main()函数方面的标准有所不同,所以我们要分开讨论。

对于C语言:
在C89标准中,main() 的形式是可以接受的,当然使用如下的C99标准更明智,因为在这个标准中只有如下格式才能被接受:
int main ( void )
int main ( int argc, char *argv[] )
我们可以对main函数做轻微的改变,比如我们可以用一个自定义的类型代替int(当然这个类型必须被定义为int型),还可以把*argv[]改为**argv,等等。

如果我们不想在命令行下对程序输入参数,可以选择第一种形式。

其实第二种形式的两个参数argc,argv的名称是可以改变的,但保持原样是更明智的选择。

main()函数的返回类型必须为int;返回的整形值作为传递给调用者的一个返回码。

(this allows a return code to be passed to the invoker)
对于C++:
以下是可以接受的格式:
int main ( int argc, char *argv[] )
int main ()
第一种格式遵从C99标准;第二种格式在不需要通过命令行向程序传递参数时使用,与C99标准中规定的格式int main(void)效果相同。

(C)int main()与int main(void)之间的区别:
很多C程序员都曾搞错的一个概念,就是以为这样一个函数不接受任何参数:
int foo();
事实上,这个函数被认为可以接受未知个数的参数(译:可接受任意多的参数!)。

正确的用法是在括号内添加关键字void。

void main()函数是如何处理的?
在C/C++正规的调用/返回函数中,如果你不想让一个函数返回任何值,你可以使用void 定义返回类型。

比如,一个不接受任何参数并且无任何返回值的函数原型可以像这样:
void foo(void);
一个常见的误解是,这种逻辑同样适用于main()函数。

呵呵,事实并非如此,main()函数是很特殊的,无论何时你都应该依照标准定义main()函数(译:即使用int main()的形式!),并把返回值定义为int。

有时void main()的例外形式是可以出现的,但这仅限于某些特定的系统。

如果你不敢肯定正在使用这些系统,那么答案很简单,不能使用void main()的形式。

如果你在论坛上写了像“void main”这样的代码而被警告,那么最好改过来。

不要用"我的老师告诉我这么做是对的"之类的话来为自己开脱;老师们总是习惯犯错误(teachers have a bad habit of being wrong)。

写安全的,合乎标准的代码,大家就可以专注于你程序中其它的问题而不是在这种规范方面的东西上浪费时间。

但是int main(int argc, char *argv[], char *envp[])又是怎么回事呢?
好比是标准的扩展版,main()函数可以在一些系统中提取一个额外的参数用来访问环境变量。

这个用法不能保证在每个编译环境中都行得通,所以使用envp 这个参数是还是谨慎为妙。

最后,关于为什么void main(void)是一种错误的用法
因为标准这么说(这种回答通常是针对这这种问题"它能正常工作!")
因为调用main()的启动程序可以被认为是入栈,如果main()不这么做,在程序退出时将导至stack corruption的问题,并且引发冲突。

(这种回答通常是针对这这种问题"它能正常工作!")
因为你可能给调用环境返回一个随机值,这是很糟糕的,因为如果有人想要检测你的程序是否失败了,或者从一个makefile中调用你的程序,那么它们将不能保证非零的返回值就是失败。

(这样的回答通常是针对这种问题"那是他们的问题")。

这里我们举一个系统的例子去证明void main(void)程序在上面第三条里将要引起的问题。

从一个脚本调用程序可能引起脚本的崩溃。

不管它的返回码是否被检测到。

从一个makefile调用它可能引起make的问题。

从命令行调用它可能引起一个错误报告。

RISC OS 是一种本地的操作系统,这个系统的方便之处是有一个系统变量Sys$RCLimit.这个变量的值是用来指定一个程序可以返回到系统的最大值,这个变量的默认值被系统设置为256.我不能确认这个变量的目的,但是它是确定存在的。

现在,让我们看一个用int main(void)的例子程序
int main(void)
{
return 42;
}
把它翻译成汇编语言,用gcc(Acorn自己的C编译会报告一个警告,并把它转换成一个返回值为0的整型函数):
|main|:
mov ip, sp
stmfd sp!, {rfp, fp, ip, lr, pc}
sub fp, ip, #4
cmps sp,sl
bllt |x$stack_overflow|
bl |___main|
mov r0, #42
ldmdb fp, {rfp, fp, sp, pc}^
第六个指令是初始化和堆栈检测,最后两个返回42到库的启动码,所以main的返回值被传递到R0.标记库启动码将要去调用一个整型的返回函数,所以能够使用R0的返回值。

void main function发生了什么?好的,这儿是一个例子。

#include <stdio.h>
char buf[1024];
void main(void)
{
(void)fgets(buf, 1024, stdin);
}
程序在他的标准输入端口等待一行文本的输入,我们把它编译成汇编语言:|.LC0|: dcd |__iob|
|.LC1|:
dcd |buf|
|main|:
mov ip, sp
stmfd sp!, {rfp, fp, ip, lr, pc}
sub fp, ip, #4
cmps sp,sl
bllt |x$stack_overflow|
bl |___main|
ldr r2, [pc, #|.LC0| - . - 8]
mov r1, #1024
ldr r0, [pc, #|.LC1| - . - 8]
bl |fgets|
ldmdb fp, {rfp, fp, sp, pc}^
area |buf|, DATA, COMMON, NOINIT
% 1024
第六个指令是启动,下面的三个为fgets的调用设置参数,那么我们调用fgets并且返回到调用者。

stdio.h中说fgets返回一个指针到缓存,所以,在这个实例中,我们返回到库启动码的是一个指向buf的指针,在RISC OS中,所有C程序被映射到内存地址0x8000.所以,我们将返回一个> 32768 的值到操作系统中,(因此,大于Sys$RCLimit默认的值).系统产生错误。

这儿是编译和运行程序的结果:
SCSI: void % gcc void.c -o void
Drlink AOF Linker Version 0.28 30/07/95
SCSI: void % show Sys$RCLimit
Sys$RCLimit : 256
SCSI: void % void
I enter this line
Return code too large
SCSI: void %
And, in a script file:
SCSI: void % cat script
void
echo Finished
SCSI: void % run script
I enter this line
Return code too large
SCSI: void %
在第二个命令运行之前,错误中断了程序
注意,上面的例子是一个小的人为的目的去使最终函数调用返回一个指针。

一个更好的例子是程序用printf:
string > 256时也会返回错误,依赖用户输入字符的长度,程序是否可能返回一个错误在于用void作为main类型的返回
所以,如果你想要你的程序更加有效,请让main返回int,这样会做的更好。

相关文档
最新文档