C语言入门系列:判断和循环常踩的5个坑

news2024/11/20 16:31:31

文章目录

    • 1. if代码块不带大括号
      • 问题描述
      • 示例与分析
      • 解决办法
    • 2. if条件和大括号之间加了一个分号
      • 问题描述
      • 示例与分析
      • 解决办法
    • 3. 使用`=`号判断相等
      • 问题描述
      • 示例与分析
      • 解决办法
    • 4. while循环的无限循环
      • 问题描述
      • 示例与分析
      • 解决办法
    • 5. for循环中的off-by-one错误
      • 问题描述
      • 示例与分析
      • 解决办法

控制结构if和循环是代码中必不可少的元素,这两种控制结构非常重要,但很容易掌握。

对于初学者来讲,有三个坑是要我们特别注意的。

1. if代码块不带大括号

问题描述

在C语言中,if语句后面如果没有加上大括号{},那么只有紧跟着if下一个语句会被视为条件满足时执行的代码块。

这经常导致意料之外的结果,尤其是当你以为多个语句都会被执行时。

示例与分析

int score = 85;

if (score > 60)
    printf("及格了!");
printf("继续努力!");

这段代码看起来像是想说如果分数大于60,就打印“及格了!”和“继续努力!”。

但实际上,不论条件是否满足,“继续努力!”都会被打印出来,因为第二个printf语句并不受if控制。

解决办法

始终使用大括号包裹if语句块,即使只有一条语句。

if (score > 60) {
    printf("及格了!");
    printf("继续努力!");
}

2. if条件和大括号之间加了一个分号

问题描述

有时候,可能是因为误操作或对语法理解不深,开发者会在if条件语句后直接跟了一个分号。

这样做实际上使if语句变成了一个没有执行体的空语句,之后的大括号块和if判断毫无关系,将无条件执行。

示例与分析

int age = 18;

// 注意if判断的分号,导致if结构到此结束,后续的代码和这个if判断无关
if (age >= 18);
{
    printf("可以投票了!");
}

这里,由于分号的存在,if条件实际上不起作用,printf语句总是会被执行,无论年龄是多少。

解决办法

移除条件判断后的分号,确保if语句正确关联其执行块。

if (age >= 18) {
    printf("可以投票了!");
}

3. 使用=号判断相等

问题描述

新手程序员常犯的一个错误是在if条件中使用赋值运算符=而非比较运算符==来判断两个值是否相等。

这不仅会导致逻辑错误,还可能因为赋值表达式本身有值(即被赋的值),使得条件判断意外地“通过”。

示例与分析

int num = 5;

if (num = 10) { // 应该是 == 而不是 =
    printf("num等于10");
} else {
    printf("num不等于10");
}

这段代码本意是判断num是否等于10,但由于使用了单个等号,实际上是将num的值设置为了10,然后这个赋值操作的返回值(即10,非零,表示真)作为条件判断,导致条件通过,打印出“num等于10”。

实际上这段代码在执行时,编译器会给出警告。

在这里插入图片描述

警告有两种级别,一种是warning,一种是error。程序员通常习惯于忽视warning,这是一个不好的习惯,特别是初级程序员。

在这里插入图片描述
那些编译器抛出的警告,不是无病呻吟,它们是在说:“嘿,我知道你可能知道你在做什么,但这个操作有点怪异,确定不是手滑吗?”

解决办法

务必使用双等号==来进行比较操作。

if (num == 10) {
    printf("num等于10");
} else {
    printf("num不等于10");
}

4. while循环的无限循环

问题描述

由于循环条件设置不当,导致循环无法自然终止。

示例与分析

int i = 0;
while (i >= 0) {
    printf("%d ", i++);
}

这里,因为i始终大于等于0,循环将永远执行下去。

解决办法

确保循环有一个明确的退出条件。

int i = 0;
while (i < 10) { // 假设循环应执行10次
    printf("%d ", i++);
}

5. for循环中的off-by-one错误

问题描述

在处理数组或序列时,因索引或计数错误导致少处理或重复处理元素。

示例与分析

int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i <= 5; i++) {
    printf("%d ", arr[i]);
}

这里,i <= 5导致访问了数组越界的位置。

解决办法

确保循环范围正确,避免越界。

int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    printf("%d ", arr[i]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1838047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS开发 :Router 和 NavPatchStatck 如何实现跳转(传参)及页面回调

路由的选择 HarmonyOS提供两种路由实现的方式&#xff0c;分别是 Router 和 NavPatchStack。两者使用场景和特效各有优劣。 组件适用场景特点备注Router模块间与模块内页面切换通过每个页面的url实现模块间解耦NavPathStack模块内页面切换通过组件级路由统一路由管理 什么时…

凌凯科技冲刺上市:2023年业绩反弹,靠关联交易助推业务发展?

近日&#xff0c;上海凌凯科技股份有限公司&#xff08;下称“凌凯科技”&#xff09;向港交所递交上市申请&#xff0c;华泰国际担任其独家保荐人。 透过招股书不难看出&#xff0c;在化学合成一体化这个虹吸效应显著的细分赛道中&#xff0c;凌凯科技拥有头部玩家的先发优势…

freemarker导出doc文档多个图片处理

POI freemarker处理多图片插入到doc文档 文章目录 POI前言一、doc模板转换成xml文件格式&#xff1f;二、修改xml文件并转为ftl文件1.集合内容2.xml修改集合处理&#xff08;1&#xff09;头部加入图片的循环&#xff08;2&#xff09;需要循环的数据集合处理&#xff08;3&am…

计算机SCI期刊,中科院2区TOP,收稿范围广泛!

一、期刊名称 IEEE Transactions on Automation Science and Engineering 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;5.6 中科院分区&#xff1a;2区top 三、期刊征稿范围 IEEE Transactions on Automation Science…

SAP ABAP开发:如何读取物料主数据中的长文本?

在SAP ERP系统中&#xff0c;物料的基本描述可存储40个字符&#xff0c;见下图&#xff1a; 但长文本信息如何从系统中读取呢&#xff1f; 在SAP ABAP开发中&#xff0c;读取物料主数据&#xff08;Material Master Data&#xff09;中的基本视图&#xff08;Basic View&#…

Redis变慢了?之二

Redis变慢了&#xff1f;之二 Redis变慢了规律性变慢Redis几种过期策略的区别&#xff1f;定时过期惰性过期定期过期优化方案 实例内存达上限内存淘汰策略 写在最后 Redis变慢了 Redis变慢上一篇文章地址&#xff1a;Redis变慢了&#xff1f;这篇文章继续Redis变慢情况的分析。…

PyQt5.QtWidgets常用函数及说明

目录 PyQt5.QtWidgets简介常用函数设置窗口标题和固定大小创建垂直布局创建进度条 PyQt5.QtWidgets简介 PyQt5.QtWidgets 是 PyQt5 库中的一个模块&#xff0c;它包含了用于创建图形用户界面&#xff08;GUI&#xff09;的各种小部件&#xff08;widgets&#xff09;。这些小部…

【ARM】如何通过Keil MDK查看芯片的硬件信息

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标&#xff1a; 解决在开发过程中对于开发项目所使用的的芯片的参数查看的问题 2、问题场景&#xff1a; 在项目开发过程中&#xff0c;经常需要对于芯片的时钟、寄存器或者一些硬件参数需要进行确认。大多数情况下是需…

【前端取不到cookie的的原因】http-only

某条cookie有http-only属性时&#xff0c;下面两种方法都取不到&#xff0c;还是改需求吧&#xff0c;别取了 1、 npm install js-cookie --save import Cookies from js-cookie let cookieValue Cookies.get(name)2、document.cookie

STM32单片机-通信协议(下)

STM32单片机-通信协议(下&#xff09; 一、通信协议介绍二、USART(通用同步/异步收发器)2.1 USART框图和基本结构2.2 串口发送2.2.1 Printf函数移植2.2.2 串口发送汉字 2.3 串口接收2.3.1 串口接收查询2.3.2 串口接收中断 2.4 USART串口数据包2.4.1 数据包格式2.4.2 数据包接收…

可平滑替代传统FTP的国产FTP方案,了解一下

企业在处理数据传输时&#xff0c;效率和安全性是关键。尽管传统FTP曾被广泛采用&#xff0c;然而&#xff0c;随着企业业务需求的增长&#xff0c;传统FTP在传输速度、安全性、稳定性以及可控性方面的不足逐渐显现。许多企业正在寻找更为高效、安全且用户体验更好的的国产FTP方…

助力低空经济-eVTOL/无人机ADS-B航管应答机选型指南

一、低空经济概述 “低空经济”在今年全国两会首次写入政府工作报告。近日&#xff0c;工业和信息化部、科学技术部、财政部、中国民用航空局印发《通用航空装备创新应用实施方案&#xff08;2024—2030年&#xff09;》&#xff0c;提出到2030年&#xff0c;推动低空经济形成…

操作系统 大作业

1、现有成绩文件按“姓名 学校 年级 班级 分数”五列组成&#xff0c;编写Shell脚本&#xff0c;将某目录下所有成绩文件&#xff08;≥3个&#xff09;合并为一个&#xff0c;形成“姓名 班级 分数”三列&#xff0c;并按成绩排序&#xff0c;输出年级排名前十。同时输出60以下…

Three.js框架的技术难点

Three.js作为一款功能强大的3D JavaScript框架&#xff0c;在为开发者提供丰富的功能和灵活性的同时&#xff0c;也带来了一些技术难点&#xff0c;需要开发者具备一定的知识和经验才能克服。以下是一些Three.js框架的技术难点。北京木奇移动技术有限公司&#xff0c;专业的软件…

高考志愿选专业,文科生如何分析选择专业?

每到高考时节&#xff0c;学生们最关注的就是专业选择&#xff0c;以及未来职业发展问题&#xff0c;对于文科生来说&#xff0c;面对文科专业的众多选择&#xff0c;很多人都有些不知所措&#xff0c;如何选择适合自己兴趣爱好&#xff0c;又有良好就业前景的工作。从哪些方面…

RTthread+STM32F407ZGTx+烟雾报警检测+蜂鸣器报警+LED闪烁||使用RTthread Studio

目录 实验背景 1.安装环境 2.配置环境 3.先编译下载实例程序2&#xff0c;观察DS0是否闪烁 4.实验方法 5.实例代码 6.硬件连接 7.实验效果 8.关于这次开发遇到的问题 1.反应慢&#xff0c;都熄灭1分钟多了&#xff0c;才报的问题&#xff1f; 2.关于rt_pin_mode(KEY…

Linux 图形化编程GTK3.0 快速入门之布局

GTK3.0 布局之水平布局 核心语法&#xff1a; 水平布局容器&#xff1a; 水平布局容器的创建&#xff1a; GtkWidget *gtk_hbox_new( gboolean homogeneous, gint spacing ); homogeneous&#xff1a;容器内控件是否大小一致( gboolean 取值为TRUE 或 FALSE ) spacing&#…

什么是数字化,什么是数智化?数字化与数智化的区别和联系

什么是数字化&#xff1f;什么是数智化&#xff1f;以及数字化与数智化的区别&#xff0c;下面分为三块跟大家详细讲解。 一、什么是数字化&#xff1f; 1、概念&#xff1a; 数字化&#xff08;Digitalization&#xff09;是将信息转换为数字&#xff08;即计算机可读&#…

操作系统之如何使用C语言完成SFJ和SRTJ,并完成他的甘特图

目录 前言 SFJ SRTJ 结束语 前言 不知不觉已经写博客一个月了&#xff0c;前段时间因为学业上的一些原因咕咕咕了&#xff0c;今天我又回来了。今天我给大家带来的是C语言代码完成的SFJ和SRTJ&#xff0c;并且带大家描述他的甘特图。如果有对SFJ和SRTJ不了解的小伙伴可以翻…

windows anaconda 安装 Labelme

安装 # 创建环境 conda create -n labelme python3.6 #激活环境 conda activate labelme # 安装依赖 conda install pyqt conda install pillow # 安装labelme conda install labelme3.16.2 # 启动labelme labelme右键选择标注类型&#xff0c;从上到下为多边形&#xff08;常…