c语言函数声明格式中不能在函数里面声明函数吗

C语言中函数的定义中 比如void print( )括号里面可以使空白吗,像void main()就可以,前者这么写对吗?
留空与否,有两层含义如果我们在函数声明时将一个函数的参数留空,它表达的意义其实是我们可以用任何参数调用这个函数。例如:int foo();我们可以用foo()调用这个函数,也可以用foo(34)调用这个函数,甚至可以用foo(“abc”)调用这个函数,最终执行的都是foo()。而如果我们将函数声明为:int foo(void);这对参数有一定的强制要求,参数只能留空,也就是我们只能以foo()的形式调用这个函数。可以用void来表达我们对参数的强制要求。
详细见此: 简而言之,C++可以省void。在C中,省不省void是两种不同的函数原型,且main的void一定不能省。另,void main ()不是文档规定范围内的写法,属于"符合标准的扩展",可移植性极低,不推荐此种挑战编译器的行为,还是写成int main (void)比较好:The function called at program startup is named main.The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:int main(void) { /* ... */ }or with two parameters (referred to here as argc and argv,though any names may be used, as they are local to the function in which they are declared):int main(int argc, char *argv[]) { /* ... */ }or in some other implementation-defined manner. ——《ISO/IEC 9899:TC3》5.1.2.2.1
可以。不过一般用(void)比较好。
看到过一种说法是c中function()等价于function(...)即参数任意可变(无论类型还是数量),而(void)则是强制要求没有参数,所以是完全不一样的。对这种模糊的区别,最好的办法就是别挑战它,按确定无二意的写法写,别给自己找不痛快。
已有帐号?
无法登录?
社交帐号登录C语言中不能在函数里面声明函数吗_百度知道10:28 提问
C语言中被调函数在主调函数的前面和后面有什么区别?
void swap(int x,int y)
printf("x=%d,y=%d\n",x,y);
void main()
//a,b是实参。
scanf("%d,%d",&a,&b);
swap(a,b);
printf("a=%d,b=%d\n",a,b);
system("pause");
输出:x=5,y=2
void main()
//a,b是实参。
scanf("%d,%d",&a,&b);
swap(a,b);
printf("a=%d,b=%d\n",a,b);
system("pause");
void swap(int x,int y)
printf("x=%d,y=%d\n",x,y);
运行结果:
输出:a=5,b=2
上面的两个为什么运行结果完全不同?第二个中的a,b的值怎么互换了?不是形参不能传递给实参吗?为什么第二个传递了?
按赞数排序
被调函数与主调函数的代码顺序,与执行的结果没有关系的。
被调函数放在主调函数后,需要先声明被调用的函数。否则,编译无法通过的。
写在后面,编译器根本不承认你的函数的存在。之所以还能运行,是因为系统库函数碰巧也有一个swap
以下是我的测试代码,所以我怀疑你的代码与你帖出来可能不太一样。
// ConsoleAppVCPlus.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
void swap(int x, int y);
int _tmain(int argc, _TCHAR* argv[])
int a, //a,b是实参。
scanf("%d,%d", &a, &b);
swap(a, b);
printf("a=%d,b=%d\n", a, b);
getchar();
void swap(int x, int y)
printf("x=%d,y=%d\n", x, y);
VS2015 运行结果:
被调函数如果放在主函数前面就不要再声明函数。如果被调函数放在主函数之后而没有在主函数声明函数就会运行报错,所以放在主函数后面应该在主函数之前先声明下被调函数!
编译器是顺序编译的,所以在编译主调函数的时候,检索到被调函数,如果在主调函数没有声明或者定义实现,对于编译器来说就是陌生的东西~编译器不知道如何处理,就会停止编译,并报错
编译器是顺序编译的,所以在编译主调函数的时候,检索到被调函数,如果在主调函数没有声明或者定义实现,对于编译器来说就是陌生的东西~编译器不知道如何处理,就会停止编译,并报错
编译器之间有顺序的,一定要注意前后顺序。
编译器确实是有编译顺序的,应该注意先写主函数。
第二个调用swap不是调用你写的swap函数,不然怎么没输出x,y
被调用的函数在主函数前先声明后调用
703关注|164收录
786关注|426收录
722关注|1142收录
其他相似问题keil编写C程序是不是不能在函数内定义变量啊,求大神_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:118,599贴子:
keil编写C程序是不是不能在函数内定义变量啊,求大神收藏
这几天玩玩单片机,刚下的keilc51的语法和C语言不太一样,也没相关的书就自己摸索,发现只要是在函数内定义的局部变量都是无效的,必须在程序最开头定义,而且不能在主函数前声明函数,此函数如果要被调用必须整个函数写在最前面。。。而且定义变量时赋值是确定变量存储地址,而不是真正的给变量赋值。。。
是我的keil版本太低还是keil用的编译器就这样。。。
每次临时想加个循环计数的变量,结果都要跑到最前边先定义,看来单片机存储单元应该也是不能释放的,如果每个变量都必须单独定义,非常麻烦还占存储空间,是不是因为单片机只能这样,还是keil只能这样。。。
提供低风险的产品开发,出色的技术支持,更低的系统总成本和更快的上市时间
可以啊!void xxx();void main() {};void xxx() {};这样是可以的啊
在主函数一开始定义就好了。这是c 语言的规定。你可能在VC6.0里边见过在主函数开始后某一行才定义,但在keil中不行,Vc容错性比较好的
肯定可以的:比如程序动态显示字符 显示光标和光标闪烁打开效果------------------------------------------------*/#include&reg52.h& //包含头文件,义#include&intrins.h&sbit RS = P2^4;
//定义端口 sbit RW = P2^5;sbit EN = P2^6;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/void DelayUs2x(unsigned char t){
while(--t);}/*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){
while(t--) {
//大致延时1mS
DelayUs2x(245);DelayUs2x(245); }}/*------------------------------------------------
判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void)
DataPort= 0xFF;
EN_SET; return (bit)(DataPort & 0x80); }/*------------------------------------------------
写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com)
while(LCD_Check_Busy()); //忙则等待 RS_CLR;
EN_CLR; }/*------------------------------------------------
写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data)
while(LCD_Check_Busy()); //忙则等待 RS_SET;
DataPort= D
_nop_(); EN_CLR; }/*------------------------------------------------
清屏函数------------------------------------------------*/ void LCD_Clear(void)
LCD_Write_Com(0x01);
DelayMs(5); }/*------------------------------------------------
写入字符串函数------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
if (y == 0)
LCD_Write_Com(0x80 + x);
LCD_Write_Com(0xC0 + x);
while (*s)
LCD_Write_Data( *s);
} }/*------------------------------------------------
写入字符函数------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
if (y == 0)
LCD_Write_Com(0x80 + x);
LCD_Write_Com(0xC0 + x);
LCD_Write_Data( Data);
}/*------------------------------------------------
初始化函数------------------------------------------------*/ void LCD_Init(void)
LCD_Write_Com(0x38);
/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
/*显示关闭*/
LCD_Write_Com(0x01);
/*显示清屏*/
LCD_Write_Com(0x06);
/*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C);
/*显示开及光标设置*/
/*------------------------------------------------
主函数------------------------------------------------*/ void main(void) {
unsigned char *pa,* LCD_Init(); LCD_Write_Com(0x0f);//光标开,光标闪烁开while (1)
pa = "Welcome to"; pb = "";
LCD_Clear();
LCD_Write_String(2,0,pa);
//显示2行信息 LCD_Write_String(1,1,pb); for(i=0;i&8;i++)
//延时2s左右
DelayMs(250);
LCD_Clear();
//清屏显示其他信息 i = 2;
while (*pa)
//循环输入方式显示2行信息{
LCD_Write_Char(i,0,*pa);
DelayMs(250);
while (*pb) {
LCD_Write_Char(i,1,*pb);
DelayMs(250);
DelayMs(250);
你应该有语法上的错误,难度你用uv1?在程序最开头定义的是全局变量,耗内存,赋值也跟c一般无二,且定义变量时赋值是确定变量存储地址??????????你确定你看懂程序了,发一下你的例子,看看
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或C语言中的所有函数都需要先定义再使用吗?
&刚碰到了一个小问题,那就是:C语言中的所有的函数都是必须要先定义然后再使用吗?这么问总是感觉有点诡异,因为C语言中变量函数等基本上都是先定义再使用的,这还有什么纠结的呢?可是把这个问题作为一个单独的问题提出来,答案恐怕就不是肯定的了,翻阅了相关资料发现,答案确实是否定的,现就C语言不遵循先定义再使用的两大特例介绍如下:
一、链表的节点定义打破了先定义再使用的限制,即可以用自己定义自己。
例1. struct student
& & & & & &
& & & & & &
& & & & & & struct student *
& & 在上例中,指针*next的定义就是自己定义自己的方式。亲们,是不是和之前的变量用法有点不一样?
二、递归函数的调用也违反了先定义在使用。
例2 &求n的阶乘n!
& & & & int Factorial(int n)
& & & & {&
& & & & & & int sum_factorial=0;
& & & & & & if(n&0)
& & & & & & & & printf(&n&0,data error!&):
& & & & & & else
& & & & & & & & if(n==0||n==1)
& & & & & & & & & & sum_factorial=1;
& & & & & & & & else
& & & & & & & & & & sum_factorial=n*factorial(n-1);
& & & & & & return(sum_factorial);
& & C语言中只有这两个特例,大家可以参考参考。
【声明】:黑吧安全网()登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱,我们会在最短的时间内进行处理。
上一篇:【】【】

我要回帖

更多关于 c语言函数的声明 的文章

 

随机推荐