为什么不包含头文件时fabs()函数返回的结果错得很离谱?为什么一定要先声明后调用?

19 篇文章 10 订阅
订阅专栏

案例一

先来看一个案例:

int main()
{
	int n = 0;
	
	float x = -123.456f;
	
	float y = fabs(x);
		
	while(1)
	{
		y = y + 1;
		
		n++;
	}
}

调试环境:

KEIL_MDK V4.72

你觉得执行完“float y = fabs(x);”这一行之后,y的值等于多少?是123.456吗?

执行结果

先看看代码:

 

再看看编译过程:

似乎没有问题。不就一个编译告警吗?又不是error,先不管它,能生成bin就好。

 

调试运行一下:

咦,y怎么变得那么大啦?

再看看,

没错啊,y的值就是这么大啊。奇怪了。。。。。。

 

 

案例二

在main.c之外,还有一个function模块。

头文件function.h的代码为:

#ifndef FUNCTION_H
#define FUNCTION_H

float GetMaxFloat(float x, float y);

#endif

源文件function.c的代码为:

#include "function.h"

float GetMaxFloat(float x, float y)
{
	float z;
	
	if (x > y)
	{
		z = x;
	}
	else
	{
		z = y;
	}
	
	return z;
}

在main()函数中增加以下几行代码:

		float a = 12.3f;
		float b = 45.6f;
		float c = GetMaxFloat(a, b);

工程情况如下:

执行完c=GetMaxFloat(a,b);之后,c的值是我们所期望的45.6吗?

来,调试一下看看:

a和b的值都是对的,但c的值错得很离谱啊。

 

解决对策

包含对应的头文件,消除编译告警!

 

现在变成这个样子:

注意:增加两行include之后,左边的黄色感叹号也没有了。

再看看运行结果:

现在,y和c的值都对啦!!

 

原因分析

编译器在没有找到函数声明的时候,会默认为返回int型。

比如,GetMaxFloat()函数,本来它应该是

float GetMaxFloat(float x, float y);

但编译器会当成是

int GetMaxFloat(double x, double y);

 

看看汇编:

正确的情况

先把12.3f和45.6f加载到s0和s1寄存器。调用GetMaxFloat函数得到计算结果,再保存到s19寄存器。

 

错误的情况

调用了__aeabi_f2d函数把a和b转换了一下(先变成double型?),再调用GetMaxFloat函数。

 

 

 

C C++ algorithm头文件的max()、min()、abs()和math头文件的fabs()_c+(1)
2401_83739472的博客
04-17 402
printf(“最大值为%lf,最小值为%lf\n”,max(d,e),min(d,e));printf(“最大值为%d,最小值为%d\n”,max(a,b),min(a,b));printf(“请输入两个浮点数(空格隔开):\n”);printf(“绝对值为%lf\n”,fabs(f));printf(“请输入两个整数(空格隔开):\n”);printf(“绝对值为%d\n”,abs©);printf(“请输入一个浮点数:\n”);printf(“请输入一个整数:\n”);
为什么应该用模块取代C/C++中的头文件
03-02
为什么应该使用模块(Module)替代头文件(Header)?众所周知,C程序在编译一般会预处理头文件:常规解决办法如下:但结果依然不够理想,比较一下代码与程序大小你会发现:另外,头文件形式的可扩展性天生不足。...
Keil STM32 不包含头文件声明函数直接调用函数导致的异常问题
欲盖弥彰1314
11-27 1722
问题 调用函数GetAmbientTemperature()获取返回值 打印出来的很大的异常数字 打印结果: 解决 参考: 关于Keil5调用函数包含对应头函数问题总结 导致问题原因就是: 没有包含对应函数头文件,编译虽然不会报错,但是读不到函数返回值。 要老老实实包含头文件或者声明函数调用函数,,, ...
取绝对值的用法: abs fabs fabsf
qq_32846277的博客
12-30 3679
int abs(int i);        //处理int类型的取绝对值 double fabs(double i);    //处理double类型的绝对值 float fabsf(float i);       //处理float类型的绝对值 具体用法 int  abs(int i);   NSLog(@"%d" , abs(-10));
C语言不包含头文件可能会导致段错误
Mrj的博客
08-10 483
虽然是很简单的问题,但是却不容忽视,在这里记录一下。Linux编程需要用到大量的函数,无论是是标准io还是文件io,不可能记得所有函数头文件,我们可以用linux的man手册来查看函数的详细介绍,另外gcc编译代码候,我建议加上-Wall选项,尽量把程序调到没有告警为止,除非里面的告警是你可以解释的,比如有些变量定义了但是没使用这样的你心里有数的。
C语言运行在64位机器上不包含头文件段错误问题深层次原因
C/C++自习室
10-11 832
之前碰到过多次这种现象: 不包含某个函数定义的头文件,编译能通过,但是一运行就出段错误, 包含了这个头文件,编译能通过,运行正常
【C】float型数据取绝对值abs后数据不对?
竹醉春风
02-19 2299
问题 使用函数abs将数据进行计算后,发现并没有得到预期的数值,正常状态下值应将-0.77的负号去掉得到正值,但实际出来结果却为0。 解决 abs的用法是针对整形变量的,double型变量取绝对值为fabs, float型变量取绝对值函数为fabsf。改为此函数fabsf即可得到正确数值0.77。 ...
c语言fabs函数返回值,fabs()函数
weixin_29248313的博客
05-22 4206
fabs函数是一个求绝对值的函数,求出x的绝对值,和数学上的概念相同,函数原型是extern float fabs(float x),用法是#include 。C语言中fabs()函数:(1)描述:C库函数double fabs(double x) ,返回浮点数x的绝对值。(2)声明:fabs() 函数声明:double fabs(double x)。(3)功能:该函数返回浮点数x的绝对值。(4...
C语言由于未包含头文件引起的段错误的两个例子
学习笔记
06-18 1705
1. 未包含头文件引起函数返回值错误出错代码:myPointer = umalloc(xxx); if (myPointer) { myPointer->memberA = aaaa; .... }在64位机器上,运行上面代码, 在执行到第4行的候会出现段错误。原因:在上述代码中, umalloc 是在另一个文件uMem.c 里面定义的, 如下。文件声明在uMem,h中。但是上面...
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?.pdf
06-30
在 C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”? extern "C" 是连接申明(linkage declaration),它告诉编译器,以 C 语言的方式编译和连接变量和函数。这种方式使得 C++ 程序可以调用被 C ...
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?.docx
06-30
C++程序中调用C编译器编译后的函数需要extern "C"的原因 在C++程序中,调用C编译器编译后的函数需要加extern "C",这是因为C++编译器和C编译器对函数的命名方式不同。C++编译器会对函数名进行名称 mangling,以便...
推荐下载C- c++-头文件中的静态函数,是什么意思?.docx
10-26
。。。
C语言float型可表达错误,float型出错了,怎么改呀?
weixin_42551227的博客
05-17 1117
#include "stdio.h"#include "conio.h"#include "stdlib.h"#include int main(){double n,flag;int m,j,k,t,r,i;double *p;double sum=0.00;printf("请输入数字的个数:");//比如说,你输入一个50,其构成的序列是(1----50)的递增序列,有50个数。scan...
C语言高级专题(8)------- 静态库和动态库的制作与使用
big_C的博客
04-22 332
1.自己制作静态链接库并使用 (1)第一步:自己制作静态链接库 首使用gcc -c只编译不连接,生成.o文件;然后使用ar工具进行打包成.a归档文件 库名不能随便乱起,一般是lib+库名称,后缀名是.a表示是一个归档文件 注意:制作出来了静态库之后,发布需要发布.a文件和.h文件。 (2)第二步:使用静态链接库 把.a和.h都放在我引用的文件夹下,然后在.c文件中包含库的.h,然后直接使用库函...
20190806
weixin_44923926的博客
08-05 133
预处理命令:gcc -E -omain.i main.c对main.c只执行预处理 相当于文本替换,只管替换,不计算 宏一律使用大写,结尾不写; 宏定义 替换的只可以读。(左值右值) 不带参宏 #define PI开始宏定义 #under PI 结束宏定义 带参宏 #define SUM(a,b) a+b #define DEBUG 只定义一个...
C语言 fabs()函数的作用
weixin_48809422的博客
12-23 1181
用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,直到某一项的绝对值小于1e-6为止。
C语言函数之 fabs()
热门推荐
weixin_45166755的博客
01-24 3万+
C语言中fabs()函数返回某一个值的绝对值的一个函数 例如: 用π/4≈1-1/3+1/5-1/7+....公式求π的近似值,直到某一项的绝对值小于1e-6为止。 ```c #include<stdio.h> #include<math.h> //数学头文件 main() { int s; float n,t,pi; n=1.0; pi=0; t=1; s=1; while(fabs(t)>1e-6) //...
(笔记)KEIL经常碰到的错误(持续整理)
最新发布
一个放笔记的小书架
04-13 2150
KEIL经常碰到的错误(持续整理)
Keil c51 函数参考
xinzhiya001的博客
10-16 4914
文章目录<math.h> 常用数学函数 cabs 原型 char cabs(char val); 功能 cabs 函数取 val 的绝对值。 参数 一 字节数 val 返回 cabs 返回 val 的绝对值。 abs 原型 Int abs( int val); 功能 求绝对值 参数 val 整型数 返回 val 的绝对值 labs 原型 long labs(long val)...
头文件函数声明为啥可以不加extern?
06-04
在 C 语言中,函数声明默认是 extern 类型的,因此在头文件声明函数,可以不加 extern 关键字。这是因为 C 语言中默认函数是外部函数,即可以被其他文件调用。在编译,编译器会自动在函数名前加上 extern 关键字,告诉编译器该函数是一个外部函数,可以在其他文件中使用。因此,头文件中的函数声明可以不加 extern 关键字,编译器会自动添加。但在 C++ 中,函数默认是内部函数,需要使用 extern 关键字显式地声明为外部函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 求绝对值函数abs()到底应该包含哪个头文件 85715
  • 更改MacBook Pro中Win10的触摸板双指滑动的方向(改为自然滚动) 77319
  • 第2.2章 使用两个“半加器”实现一个“全加器” 45194
  • Simulink建模与仿真学习笔记之选择器模块(Selector) 34942
  • 第2.4章 使用与门、或门、非门来设计异或门 31097

分类专栏

  • VSCode 5篇
  • RT-Thread 2篇
  • QT 6篇
  • DSP 26篇
  • ARM+Linux 10篇
  • IEEE 2030.5 4篇
  • Tesla Powerwall 3篇
  • OFFICE 6篇
  • MATLAB/Simulink学习与应用 46篇
  • 嵌入式软件开发 41篇
  • 信号量小书 30篇
  • nandgame计算机组成原理 18篇
  • 使用LogiSim自制简易CPU 10篇
  • 《编码的奥秘》读书笔记 8篇
  • 软件开发 6篇
  • 微笔记 39篇
  • KEIL-MDK开发环境 19篇
  • VS2008 2篇
  • 随笔 3篇
  • 经验案例 18篇
  • MFC 2篇
  • C/C++ 6篇
  • USB笔记

最新评论

  • matlab崩溃问题记录:matlab has encountered an internal problem needs to close

    Auto_yaoyao: 天呢,哪个库啊,从哪儿开始重装啊

  • matlab崩溃问题记录:matlab has encountered an internal problem needs to close

    Auto_yaoyao: 我是崩溃的,我要用simulink,死活弹窗。。。还是不行,没有AMD

  • KEIL-MDK仿真STM32系列CPU的调试参数设置

    booksyhay: 那只能是官网啊:https://developer.arm.com/documentation/ka002225/latest

  • 我的MBD自学之路(Matlab, Simulink, Stateflow)

    m0_65026903: 哥们,效果如果

  • KEIL-MDK仿真STM32系列CPU的调试参数设置

    向月葵282: 请问在哪里可以查看keil可以支持模拟仿真那些型号啊

大家在看

  • 【终极指南】从零开始征服机器学习:初学者的黄金路线图 373
  • Stable Diffusion ControlNet垫图:IP-Adapter实现图片风格迁移
  • AI绘画Midjourney及Stable Diffusion (SD)教学及商业变现项目分享
  • Symfony框架详解:构建高效、可维护的Web应用
  • ARM架构(二)—— arm v7/v8/v9寄存器介绍 276

最新文章

  • 在VS code中配置MSVC来编译C语言程序
  • 在VScode中编译C程序
  • 哈哈哈哈真有意思,可以下载到STM32-CLASSB-STL自检库了!
2024年12篇
2023年7篇
2022年14篇
2021年30篇
2020年40篇
2019年49篇
2018年69篇
2016年1篇
2015年2篇
2014年9篇
2013年29篇
2012年4篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码爱联营销型网站建设大鹏百度竞价包年推广双龙网络推广宝安百搜标王坑梓建设网站西乡建设网站宝安设计公司网站坑梓SEO按效果付费大芬网站制作设计深圳百度seo永湖模板网站建设坪地网站优化推广平湖百搜词包同乐企业网站设计民治SEO按天收费沙井阿里店铺托管爱联建网站布吉百度seo坪地网站搜索优化南联外贸网站建设木棉湾优秀网站设计大浪百度爱采购石岩如何制作网站龙岗网站推广工具龙华网站关键词优化横岗至尊标王平湖建网站平湖网站推广工具罗湖网页制作双龙网络广告推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化