首页 文章 精选 留言 我的

精选列表

搜索[文本输入],共10014篇文章
优秀的个人博客,低调大师

为什么你的第二个 scanf 还没输入就直接跳过了?C语言输入缓冲区陷阱

写了几年 C 语言,我发现很多刚入门的学弟学妹在处理多分支选择时,全是一成不变的 `if-else if-else` 叠罗汉。每次看到那种嵌套了七八层的代码,维护起来简直是折磨。 其实,当你在处理固定几个整数或者字符的条件判定时,用 `switch-case` 结构会让代码干净得多。今天不聊教科书上那些死板的语法定义,直接来看看这玩意在真实开发里怎么用,以及在 Visual Studio 2013 环境下有哪些一碰就死锁的编译深坑。 ### 为什么不能用 switch 去判定浮点数? 我们先来死磕一个最基础的底层逻辑:`switch` 的括号里,为什么只能放整型(`int`、`char`、`short` 等),而绝对不能写 `double` 或 `float`? 老实说,我当年刚学 C 语言的时候也试过把浮点数塞进 `switch` 里,结果 VS2013 直接一枪头拍出了 `error C2450: switch 表达式的类型“double”非法` 的编译报错。 设计 C 语言的大佬们之所以这么规定,是因为浮点数在内存里的存储天然就是不精确的。比如你在代码里写个 `0.1`,它在内存里可能实际是 `0.10000000149011612...`。`switch` 的本质是在内存里寻找精准的等值匹配,如果允许浮点数进来,两个看似相等的 case 可能会因为最后一位微小的精度偏差导致匹配失败。这种不确定性对编译器来说是个灾难。所以记住一条铁律:**只要涉及小数分支,老老实实用** **`if`** **的范围判定,`switch`** **只认整数。** ### 在 VS2013 下跑得通的真实业务代码 我们拿一个学生成绩等级评定的常规业务来写个完整的例子。注意,由于 VS2013 默认采用 C89 标志,变量声明一定要老老实实写在函数块的最开头,别习惯性地在中间临时定义,否则会触发 `error C2143: 语法错误 : 缺少“;”(在“类型”的前面)`。 ```c #include int main() { char grade; int score = 85; /* 将百分制分数折算成阶梯整数 */ switch (score / 10) { case 10: case 9: grade = 'A'; break; case 8: grade = 'B'; break; case 7: grade = 'C'; break; case 6: grade = 'D'; break; default: grade = 'F'; break; } printf("最终评定等级为: %c\n", grade); return 0; } ``` 这段代码里有个小技巧:`case 10:` 后面什么都没写,直接顺延到了 `case 9:`。这是故意利用了 `switch` 的特殊机制,让 90 分和 100 分都走到 'A' 等级的逻辑里。行后的 `break` 必须加,不加的话程序会一直往下死穿,这就是明天我们要单独拎出来抽打的“穿透效应”。 ### 避坑清单:case 后面初始化变量引发的死锁级报错 这是初学者最容易踩、而且死活想不通的一个大坑。有时候我们想在某个具体的 `case` 分支里定义一个临时变量存数据,写出来的代码往往长这样: ```c switch (type) { case 1: int temp_data = 100; /* 错误写法:VS2013 会在这里爆 error C2143 */ printf("%d", temp_data); break; default: break; } ``` 你一旦按 F5 编译,VS2013 绝对会弹出 `error C2143` 或 `error C2141`。 为什么?因为 `switch` 内部的所有 `case` 在内存视角里其实处于同一个作用域(花括号范围内)。你在 `case 1` 里定义了 `temp_data`,如果程序运行时直接跳到了 `default` 分支,那么这个 `temp_data` 到底算分配了还是没分配?编译器在做静态语法检查时无法容忍这种作用域内的二义性。 **正确做法有两种**:要么把 `temp_data` 提到整个 `switch` 语句的外面开头声明;要么在 `case 1:` 后面强行加一个花括号 `{}`,把这个分支变成独立的局部作用域。我个人更推荐前者,代码看起来更干净。 *** **标签**:`#C语言` `#switch语句` `#VS2013` `#编译报错` `#零基础编程`

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册