C语言基础:哪儿来的32766

这篇文章通过一个简单的示例程序来介绍一下如何结合使用IDE来学习C语言。

大家好,又见面了,我是你们的朋友全栈君。

这篇文章通过一个简单的示例程序来介绍一下如何结合使用IDE来学习C语言。


示例代码

#include <stdio.h>

int main(void) { 
   
    int max(int x,int y);
    int a, b, c;
    scanf("%d,%d",&a,&b);
    c=max(a,b);
    printf("max=%d\n",c);
    return 0;
}

int max(int x, int y) { 
   
    int z;
    if (z>=y) z=x;
    else z=y;
    return (z);
}

上述的代码虽然存在很多问题,但是作为一个从来没有接触过C的小朋友,极短的时间之内就写出来的代码,值得鼓励,相较于当时开始只会写Hello World的我,已经感觉在沙滩上晒太阳了。

问题现象

问题的现象如下所示:输入1 3,返回的max是32766,本来应该是3,哪儿来的32766?
在这里插入图片描述

原因分析

稍有经验的开发者会知道这是scanf的格式化输入的问题,因为需要满足的格式是”%d,%d”,输入需要是“1,3″,缺少逗号会使得第二个%d实际没有获得输入,而其所对应的变量又没有初始化,编译器初始化的时候设定的值被显示了出来。

结果验证

这篇文章继续介绍一下IDE的使用,如何验证上述原因的分析,如下设定一行调试断点,然后单击Debug模式的按钮进行调试模式,并在控制台输入提示中输入1 3
在这里插入图片描述
回车之后即可看到如下内容:
在这里插入图片描述
可以看到变量a被设定为1,而变量b并没有成功设定为3,而变量b初始化时被设定为了这样的一个值,直接影响了结果。而如果我们输入1,3,则能正常动作。
在这里插入图片描述

扩展思考

本身这并没有什么太大的问题,可以理解为对于scanf格式化输入的不理解。scanf除了打比赛和学校的考试,实际用到的情况确实并不多见,不算是什么问题。但是32766这个值的背后需要继续思考一下。这样的问题在实际的项目中也会有很多,根本原因往往在于变量使用之前(比如本文的if判断)没有赋值,当然除了漏了之外,还有很多原因,比如逻辑错误导致,比如编码失误,在复杂的业务逻辑和实现逻辑的背景之下,出现类似的问题有时非常难查,所以会回归到一个非常简单的编程习惯:变量初始化。本来是变量a和b比较大小,如果简单修改一下:
在这里插入图片描述
只需要进行初始化,就可以看到,至少值的范围都在考虑范围之内。

编码规范

除了变量初始化,上述代码可能是刚入的新人经常会写出的代码,有如下建议:

  • 变量尽可能短而知意,a、b、c显然不是
  • 合理使用代码锁进
  • 所有变量尽可能进行初始化
  • 声明的部分不要写在main函数中
  • 变量的定义可以考虑写在main函数之前
  • 只有一条语句的if或者else建议规范{}的使用
  • 如果希望使用c的精简的语法写短这个功能,简单学习一下?:表达式和宏的使用,代码会短很多

总结

至于为什么是32766,实际上深入研究还有更多的知识,这里不再展开,有兴趣的可以继续研究。这篇文章主要介绍一下IDE的辅助使用方法以及一些基础的编程规范。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124736.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机组成原理(哈工大)学习笔记

    计算机组成原理(哈工大)学习笔记文章目录计算机组成原理一 计算机系统概论 1 1 计算机系统简介一 计算机的软硬件概念二 计算机系统的层次结构三 计算机体系结构和计算机组成 1 2 计算机的基本组成 1 3 计算机硬件的主要技术指标一 机器字长二 运算速度三 存储容量三 系统总线总线的基本概念总线的分类总线的特性和性能指标总线控制 重点 四 存储器 1 概述一 存储器分类二 存储器的层次结构 2 主存储器 1 概述 2 半导体存储芯片简介 3 随机存取存储器 RAM 4 只读存储器 ROM 5 存储器与 CPU 的连接 6 存储器的校验 7 提高访存速度的措施 3

    2025年6月22日
    5
  • 01 、Solr7.3.1 在Win10平台下使用jetty的部署及配置

    01 、Solr7.3.1 在Win10平台下使用jetty的部署及配置

    2021年8月23日
    58
  • 实用分享-在线公式编辑器(可导图识别)[通俗易懂]

    分享一款在线公式编辑器,之前写论文和技术文档常用,超级超级方便,通过截图方式截取公式,拉到这个编辑器里,latex语言就自动出现了,放在word公式编辑器里也可以,放在CSDN的公式编辑器里也可以,就不用手搓公式了。。。论文党的福利,特别是数学系物理系这种推公式推到头大的专业。

    2022年4月8日
    61
  • LabVIEW图像分割算法(基础篇—6)

    LabVIEW图像分割算法(基础篇—6)图像分割是简化机器视觉算法的有效手段之一。它将图像分成一些有意义的区域,以便特征提取过程可基于这些区域提取目标的特征。

    2022年5月20日
    52
  • CEGUI小结

    CEGUI小结CEGUI文件类型.scheme它是CEGUI首先调用的一个文件,内容包括要使用的imageset文件、所对应的looknfeel文件,以及将要在looknfeel定义的控件的类型、工厂、渲染器和在looknfeel中的名字。如其中windowset指定了装载模块(.dll等)的名称,和一组可以注册到系统中的widget.不同版本的CEGUI里面scheme文件的结构可能

    2022年7月23日
    7
  • 超声波雷达简介_陕西雷达简介

    超声波雷达简介_陕西雷达简介超声波雷达听着很陌生,但其实一直被广泛使用在倒车上,与毫米波雷达不同的是:超声波能被任何材质的障碍物反射,毫米波只能被金属物体反射,超声波雷达的探测距离又很近,到底工作原理是什么,下面我带大家一起来来看看。1.工作原理超声波雷达的工作原理是通过超声波发射装置向外发出超声波,到通过接收器接收到发送过来超声波时的时间差来测算距离。常用探头的工作频率有40kHz,48kHz和58kHz三种。一般来说,频率越高,灵敏度越高,但水平与垂直方向的探测角度就越小,故一般采用40kHz的探头。超声波

    2025年10月31日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号