http://www.geeksforgeeks.org/g-fact-95/

1 在C语言中,如果函数在声明之前被调用,那么编译器假设函数的返回值的类型为INT型,

所以下面的code将无法通过编译:

#include <stdio.h>
int main(void)
{
// Note that fun() is not declared
printf("%d\n", fun());
return ;
} char fun()
{
return 'G';
}

错误:其实就是fun函数定义了两遍,冲突了

test1.c::: error: conflicting types for 'fun'
char fun()
^
test1.c::: note: previous implicit declaration of 'fun' was here
printf("%d\n", fun());
^

将返回值改成int行可以编译并运行:

#include <stdio.h>
int main(void)
{
printf("%d\n", fun());
return ;
} int fun()
{
return ;
}

2 在C语言中,如果函数在声明之前被调用,如果对函数的参数做检测?

compiler assumes nothing about parameters. Therefore, the compiler will not be able to perform compile-time checking of argument types and arity when the function is applied to some arguments. This can cause problems.

编译器对参数不做任何假设,所以无法做类型检查。 下面code就会有问题,输出是garbage

#include <stdio.h>

int main (void)
{
printf("%d", sum(, ));
return ;
}
int sum (int b, int c, int a)
{
return (a+b+c);
}

输出结果:

diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 

diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 

diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out
-
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out
-
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out
-
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out diego@ubuntu:~/myProg/geeks4geeks/cpp$

所以It is always recommended to declare a function before its use so that we don’t see any surprises when the program is run (See thisfor more details).

[C/CPP系列知识] 在C中使用没有声明的函数时将发生什么 What happens when a function is called before its declaration in C的更多相关文章

  1. [C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++

    http://www.geeksforgeeks.org/extern-c-in-c/ C++函数重载(function overloading),但是C++编译器是如何区分不同的函数的呢?----是 ...

  2. [C/CPP系列知识] 那些程序C语言可以编译通过但C++无法编译成功 Write a C program that won’t compile in C++

    http://www.geeksforgeeks.org/write-c-program-wont-compiler-c/ 1) C++中在函数声明之前调用一个函数会引发错误,但是在C中有可能可以. ...

  3. Js中有关变量声明和函数声明提升的问题

    在ECMAScript5中没有块级作用域一说,只有函数作用域和全局作用域,在其中声明的变量和函数和其他语言的展现形式不同,在某些情况下不一定需要先定义后使用,函数和变量的使用可以在其声明之前,这到底是 ...

  4. [C/CPP系列知识] Type difference of character literals 和 bool in C and C++

    C/C+中的每一个常亮(every literal)都是有类型的,例如10 就是int型的,因此siziof(10)和sizeof(int)是相同的,但是字符型常亮(‘a’)在C和C++中有不同的变量 ...

  5. C++中全局变量的声明和定义

    原文链接:http://blog.csdn.net/candyliuxj/article/details/7853938 (1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文 ...

  6. 关于C语言中的结构体内嵌函数(转)

    https://blog.csdn.net/qq_39490500/article/details/80457831 看门见山 1.内嵌函数定义举例:经过真实测试 在函数中声明定义结构体 #inclu ...

  7. 【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  8. 《Visual C++ 2010入门教程》系列四:VC2010中初学者常见错误、警告和问题

    <Visual C++ 2010入门教程>系列四:VC2010中初学者常见错误.警告和问题   这一章将帮助大家解释一些常见的错误.警告和问题,帮助大家去理解和解决一些常见问题,并了解它的 ...

  9. Java基础扫盲系列(-)—— String中的format

    Java基础扫盲系列(-)-- String中的format 以前大学学习C语言时,有函数printf,能够按照格式打印输出的内容.但是工作后使用Java,也没有遇到过格式打印的需求,今天遇到项目代码 ...

随机推荐

  1. Windows Phone 8开发环境搭建

    开发Windows Phone需要两个工具:Windows Phone SDK 8.0和Visual Studio集成开发工具.我们购买的Visual Studio Ultimate 2012不包括W ...

  2. Cocos2d-x场景生命周期函数介绍

    层(Layer)的生命周期函数有如下: init().初始化层调用. onEnter().进入层时候调用. onEnterTransitionDidFinish().进入层而且过渡动画结束时候调用. ...

  3. 解析Path方法备忘

    public static String parseDataPath(String dataPath){ StringBuilder parseBld = new StringBuilder(); L ...

  4. 济南学习 Day 3 T1 pm

    巧克力棒(chocolate)Time Limit:1000ms Memory Limit:64MB题目描述LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克 ...

  5. c++之RTTI介绍

    本文介绍c++的RTTI的基本用法,并初步研究RTTI的实现原理. 1. 什么是RTTI RTTI即运行时类型识别(runtime type identification),用于判断指针或引用所绑定对 ...

  6. mysql快速上手2

    上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...

  7. 《Apache之虚拟主机的配置》——RHEL6.3

    1.安装httpd软件包: Yum install httpd 2.启动apache服务: [root@redhat Desktop]# /etc/init.d/httpd start Startin ...

  8. CSS3 text-rendering属性

    这种非标准的属性目前不被推荐.我们一般会找一个可以替代的方法来完成相同的功能,不到外不得已,最好别用.   CSS的这个text-rendering属性通常被用在Windows和Linux系统中,用来 ...

  9. RHEL7 添加用户,含sudo权限

    1.添加普通用户[root@server ~]# useradd book //添加一个名为book的用户 [root@server ~]# passwd book //修改密码 Changing p ...

  10. CentOS 普通用户设置sudo权限

    1.先切换到root用户下,输入命令 su 2.添加sudo文件的写权限,命令是: chmod u+w /etc/sudoers 3.编辑sudoers文件 vi /etc/sudoers 找到 ro ...