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的辅助使用方法以及一些基础的编程规范。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • scrapy的爬虫案例

    scrapy的爬虫案例importscrapyfrom..itemsimportXiaoyouhuiItemclassXiaoyoujiSpider(scrapy.Spider):name=’XiaoYouHui’allowed_domains=[‘www.chinaxy.com’]start_urls=[‘http://www.chinaxy.com/2022index/2022/2022zymlall.html’]yjmu=[‘法学’,’工学’,’管理学’.

  • 谈谈唯一约束和唯一索引的关系_唯一约束和主键约束的一个区别是

    谈谈唯一约束和唯一索引的关系_唯一约束和主键约束的一个区别是最近在看数据库相关知识,感觉唯一约束和唯一索引好像有点类似,于是研究了一番,于是就有了这篇文章。概念开始之前,先解释一下约束和索引。约束全称完整性约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的准确性和一致性。索引数据库中用的最频繁的操作是数据查询,索引就是为了加速表中数据行的检索而创建的一种分散的数据结构。可以把索引类比成书的目录,有目录…

  • mybatisplus整合springboot(Springboot框架)

    记得刚接触SpringBoot时,大吃一惊,世界上居然还有这么省事的框架,立马感叹:SpringBoot是世界上最好的框架。哈哈!当初跟着教程练习搭建了一个框架,传送门:springboot+jpa+bootstrap+thymeleaf简单的增删改查Demo后来进了新公司,用不到而且忙于任务,今天重温一遍居然有些忘了,看来真是好记性不如烂笔头。于是写下本篇SpringBo…

  • p750tm安装linux系统,Android 开发环境(虚拟机,LINUX, secureCRT)安装过程.pdf

    p750tm安装linux系统,Android 开发环境(虚拟机,LINUX, secureCRT)安装过程.pdfAndroid开发环境(虚拟机,LINUX,secureCRT)安装过程Androidlinux开发环境(虚拟机,LINUX,secureCRT)安装过程注意由于selinux打开,smb不能正常工作。Windows不能够访问虚拟机,要关闭selinux才能正常访问。解决方法:vi/etc/sysconfig/selinuxSELINUX=enforcing–>…

  • java velocity 语法_Velocity 语法

    java velocity 语法_Velocity 语法VelocityNotes变量名$name为空时打印变量本身。$!name为空时打印空字符串(不打印任何内容)。${name}类似$name,为空时原样打印。但可以将变量和连续的字符串分隔,例如:${name}space。$!{name}类似$!name,为空时打印空字符串,但可以将变量和连续的字符串分隔。例如:$!{name}space。$name$!name${name}$!{name…

  • 在Windows XP 上 架设 FTP服务器

    在Windows XP 上 架设 FTP服务器架设一台FTP服务器其实很简单。首先,要保证你的机器能上网,而且有不低于ADSL512Kbps的网络速度。其次,硬件性能要能满足你的需要。最后,需要安装FTP服务器端的软件,这类软件很多,可以使用微软的IIS(InternetInformationServer因特网信息服务系统),也可以使用专业软件。不同的软件提供的功能不同,适应的需求和操作系统也不同。一般来说,系统最低要求如下:CPU

发表回复

您的电子邮箱地址不会被公开。

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