C语言中fun1()和fun2(void)的区别

在一次C语言实训中我发现老师在对无参函数的书写中写成fun2(void)的形式,这引起了我的好奇心,我只知道fun1()和fun2(void)是两个无参函数,后者是C99中规定的,void的意思就是该函数不接受任何参数,但是我在使用的过程中除了对fun2传参会导致报错以外没有发现别的问题,所以就开始好奇为什么老师在实训时会特意在没有传参的函数里写上void。

经过谷歌搜索得到以下结论

(C) The difference between int main() and int main(void)A common misconception for C programmers, is to assume that a function prototyped as follows takes no arguments:int foo();In fact, this function is deemed to take an unknown number of arguments. Using the keyword void within the brackets is the correct way to tell the compiler that the function takes NO arguments.

参考文章:https://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1044841143&id=1043284376

但是我还是不能理解到底为什么要这样定义,最后在抖音的一个博主(抖抖代码)那里得到了解答

以下是博主演示的代码:

#include<stdio.h>
int main(void){void fun1();void fun2(void);fun1();fun2();return 0;
}
void fun1(){printf("doudou \n");
}
void fun2(){printf("douodu 2\n");
}
/*
得到输出为:
doudou
douodu 2
*/

在没有传入任何参数的情况下两者都是被正常运行的。

但是如果对fun1和fun2分别进行传参,其结果如下

//fun1
#include<stdio.h>
int main(void){void fun1();void fun2(void);fun1(888,999);// fun2();return 0;
}
void fun1(){printf("doudou \n");
}
void fun2(){printf("douodu 2\n");
}
//输出为
//doudou
#include<stdio.h>
int main(void){void fun1();void fun2(void);// fun1(888,999);fun2(888,999);return 0;
}
void fun1(){printf("doudou \n");
}
void fun2(){printf("douodu 2\n");
}
/*输出为
test.c:20:5: error: too many arguments to function 'fun2'fun2(888,999);^~~~
test.c:18:10: note: declared herevoid fun2(void);*/

由此得出,在对fun1()和fun2(void)传参时,fun2会直接报错中断程序的运行。如果不含参的函数不带void并进行传参的话,表面上不会有任何影响,但是在Linux或者Unix平台中函数的参数会被推入堆栈中,所以只要读取参数所推入的寄存器便可获得传入的参数

#include <stdio.h>
int main(void)
{void fun1();fun1(888, 999);return 0;
}
void fun1()
{register int sp1 asm("di"); //关联第一个参数register int sp2 asm("si"); //关联第二个参数printf("%d,%d", sp1, sp2);
}

研究这个问题花费了我三个小时,三个小时的时间也许可以让我学完一种特性或者几个语法糖,但是对这个小细节的求解却让我乐在其中。编程的魅力让我无法自拔。

C语言中fun1()和fun2(void)的区别相关推荐

  1. c语言gets和getchar区别,C语言中 gets 和 getchar 有什么区别

    C语言中 gets 和 getchar 有什么区别 发布时间:2020-07-22 09:14:29 来源:亿速云 阅读:81 作者:Leah 这期内容当中小编将会给大家带来有关C语言中 gets 和 ...

  2. C语言中的sizeof()和strlen()的区别

    C语言中的sizeof和strlen的区别 sizeof() strlen 大量案例(想深入了解可以看) 1.(花括号int的sizeof()) 2.(花括号char的sizeof()) 3.(字符串 ...

  3. 计算机汇编指令mov和mova,汇编语言中mov和lea指令的区别详解

    指令(instruction)是一种语句,它在程序汇编编译时变得可执行.汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行. 一条指令有四个组成部分: 标号(可选) 指令助记符(必需) ...

  4. c语言is int number,C语言中NSInteger,NSNumber以及Int的区别

    NSInteger和NSNumber 首先:NSInteger,NSNumber并没有什么关系,更不要想当然的以为二者还有什么继承关系,甚至还有人问NSInteger是不是NSNumber的子类?答案 ...

  5. C语言中的strlen与sizeof的区别

    sizeof与strlen是有着本质的区别,sizeof是求数据类型所占的空间大小,而strlen是求字符串的长度,字符串以/0结尾.区别如下: (1) sizeof是一个C语言中的一个单目运算符,而 ...

  6. 汇编语言中b和bl关键字的区别

    汇编语言中b和bl关键字的区别是什么? b save_boot_params bl v7_arch_cp15_set_l2aux_ctrl b是普通的跳转语句,跳到save_boot_params之后 ...

  7. C语言中的i++和++i的区别与联系

    1.单独使用 在C语言中,我们使用i++来实现自增操作,同样++i也适用于自增操作的,这时的i++和++i与i=i+1是等价的. #include <stdio.h> int main() ...

  8. C语言中,#include 和#include 的区别和注意点

    C语言中包含文件有两种包含符号,一个是<>尖括号,另一个是""双引号.那么这两个有什么区别呢? 首先在本地建立一个空文件,命名为stdio.h. 然后再建立一个C文件, ...

  9. C语言中, include 和 include 的区别和注意点

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow C语言中包含文件有 ...

最新文章

  1. C 标准库 - ctype.h
  2. 网络hack工具介绍
  3. 程序猿小白应该注意什么
  4. SQL语言之同义词(Oracle)
  5. RxJava 和 RxAndroid 二(操作符的使用)
  6. html中怎么用js把表格清空_一款简洁非常好用的前端表格组件库
  7. 在 IE 中使用 HTML5 元素
  8. opc服务器不显示目录,本地OPC服务器无法显示
  9. virtualbox linux通用网卡,详解VirtualBox + CentOS 虚拟机网卡配置
  10. springboot mvc html,完美起航-SpringBoot整合MVC
  11. kotlin-2(IdeaIU-2018.2汉化破解)
  12. linux系统如何解压rar文件
  13. 旋转矩阵的导数(机器人学)
  14. [JAVA冷知识]什么是逆变(contravariant)与协变(covariant)?数组是否支持协变逆变?泛型呢?
  15. python 山脊图_纯Python绘制满满艺术感的山脊地图
  16. 互不相容的零缺陷与全面质量管理
  17. 刘德华开抖音了,一键下载华仔所有无水印视频
  18. 视频增强,去雾的实现 BU6521KV
  19. word技巧-大纲与目录
  20. pwnable.kr第七八题 input leg

热门文章

  1. AndroidStudio004--RelativeLayout相对布局使用
  2. jvm学习第十、十一天、十二天—垃圾回收器1、垃圾回收的相关概述2、 垃圾回收相关算法3、 垃圾回收器
  3. Verilog 实现 UART RX 接收器
  4. 日本空手道美女走红 堪称现实版春丽
  5. java出现无法读取_Java无法读取字体
  6. 25省/市5G最新进展与规划汇总
  7. 写给前端开发者的「Promise备忘手册」
  8. matlab加工表面微观,车铣复合加工表面微观几何形貌仿真及切削参数分析研究
  9. 使用一片四运放LM324组成所需电路
  10. android登录系统论文,基于Android的物业管理信息系统的设计与实现.docx