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

文章目录

    • 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]);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab只选取自己需要的数据画图

在Matlab作图的时候&#xff0c;经常会在同一个坐标系中作很多数据的图&#xff0c;如下图所示&#xff1a; 这就会导致不同数据所作的线会重叠在一起&#xff0c;不利于数据分析。如果只想对比几个数据的趋势&#xff0c;直接修改代码太过麻烦&#xff0c;可通过Matlab的绘图…

Python酷库之旅-比翼双飞情侣库(15)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …

开源新纪元:ChatTTS——引领对话式文本转语音的新潮流

✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点赞、关注、收藏、评论&#xff0c;是对我最大…

帕金森病患者应对腿部无力的方法

帕金森病是一种慢性神经系统退化性疾病&#xff0c;主要影响运动系统&#xff0c;导致运动功能障碍。患者常见的症状包括肌肉僵硬、运动迟缓、静止性震颤和姿势不稳。这些症状可能会导致患者在行走时感到腿软无力&#xff0c;尤其是在起步或转弯时更为明显。 帕金森病患者在日常…

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

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

C++语法01 基本框架

目录 什么是 C &#xff1f; 新建源程序 保存源程序 程序基本框架 #include using namespace std; int main() return 0; 编译 运行 什么是 C &#xff1f; C语言&#xff0c;是基本的程序设计语言之一【程序设计语言&#xff0c;简单的来说就是编写代码来操控计…

【深度学习驱动流体力学】OpenFOAM框架剖析

目录 1. applications 目录solvers&#xff1a;存放各种求解器。mesh&#xff1a;网格生成相关工具。 2. src 目录3. tutorials 目录其他主要目录和文件参考 OpenFOAM 源码文件目录的框架如下,OpenFOAM 是一个开源的计算流体力学 (CFD) 软件包&#xff0c;其源码文件结构设计精…

Maven 插件列表详解

Maven 是一个强大的项目管理和构建工具&#xff0c;广泛应用于 Java 项目中。作为一款优秀的构建管理工具&#xff0c;Maven 不仅提供了标准化的项目结构和依赖管理&#xff0c;还通过其丰富的插件系统&#xff0c;极大地扩展了其功能和灵活性。无论是代码编译、测试、打包&…

小程序分页新写法

// pages/query/query.js import {request } from ../../utils/request; Page({/*** 页面的初始数据*/data: {tabClickIndex: ,page: 1,limit: 10,listData: []},/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getList()},/*** 生命周期函数--监听页面初次渲染完成*…

uniapp运行到模拟器(联想模拟器)

记录一下uniapp项目运行到联想模拟器的流程 先配置一下模拟器端口 填写对应的adb路径&#xff0c;也就是模拟器安装路径下的adb.exe的路径 然后打开模拟器的设置&#xff0c;搜索版本找到版本号&#xff0c;多次点击打开开发者模式 进入开发者选项&#xff0c;打开USB调试 …

QT 中QcomboBox控件的详细用法

在Qt中&#xff0c;QComboBox 是一个用于选择下拉列表中的项目的控件。它继承自 QWidget 并提供了许多成员函数来操作和管理这个下拉列表。以下是一些常用的 QComboBox 成员函数及其基本用法&#xff1a; 构造函数 QComboBox(QWidget *parent nullptr): 创建一个新的 QCombo…

职业探索-性能测试01-性能工程师成长路径-性能测试的核心概念-性能测试的全周期概览

职业探索-性能测试01-性能工程师成长路径-性能测试的核心概念-性能测试的全周期概览 参考来源 极客时间专栏&#xff1a;高楼的性能测试实战30讲 课程链接&#xff1a;https://time.geekbang.org/column/intro/100042501 性能测试分析的能力阶梯视图 性能工程师 真正的性能…

FuTalk设计周刊-Vol.034

&#x1f525;AI漫谈 热点捕手 1、反转反转再反转&#xff01;OpenAI“内斗”风波始末 故事还远远没有结束&#xff0c;一场“宫斗”解决不了商业世界影响下科技发展的路线之争&#xff0c;或许未来还将有很多“选择”将困扰这家年轻的企业&#xff0c;这是AI领域发展下必将经…

【论文阅读】-- 时间空间化:用于深度分类器训练的可扩展且可靠的时间旅行可视化

Temporality Spatialization: A Scalable and Faithful Time-Travelling Visualization for Deep Classifier Training 摘要1 引言2 动机3 问题定义4 方法论4.1 时空复合体4.2 复数约简 5 实验6 相关工作7 结论参考文献 摘要 时间旅行可视化回答了深度分类器的预测是如何在训练…

【单片机毕业设计选题24015】-基于物联网的家用智能充电桩计费系统设计

系统功能: 采用STM32最小系统板控制 1. 通过IM1281B电能计量模块读取系统电压电流功率电能等信息 2. 通过ESP8266WiFi模块连接阿里云 3. 使用RFID模块刷卡 4. 继电器模块控制充电 5. 12864OLED模块显示系统信息 6. 开启充电但检测不到系统电压时蜂鸣器模块报警。 主要功…

delphi 开发app

好的工具用起来就会顺手&#xff0c;很多Delphi从业者用惯了Delphi工具&#xff0c;在面对移动APP称王的时代似乎有力使不出。现在不用再担心JAVA语言的一些特性&#xff0c;太纠结了。我们直接用Delphi XE7开发吧。虽然Delphi XE2开始就支持移动开发了&#xff0c;但这中间的五…

ubuntu永久换镜像源详细方法

1.查看ubuntu的版本&#xff0c;不同的版本对应的不同的镜像源&#xff08;下面会讲到&#xff0c;先按步骤操作即可&#xff09; cat /etc/issue 2.先备份一个&#xff0c;防止更改错误 cp /etc/apt/sources.list /etc/apt/sources.list.backup 3.备份好之后删除原有的sour…

VUE 项目用 Docker+Nginx进行打包部署

一、Docker Docker 是一个容器化平台&#xff0c;允许你将应用程序及其依赖项打包在容器中。使用 Docker&#xff0c;你可以创建一个包含 Vue.js 应用程序的容器镜像&#xff0c;并在任何支持 Docker 的环境中运行该镜像。 二、Nginx Nginx 是一个高性能的 HTTP 服务器和反向…

能提醒我重要工作事项的软件是什么 工作提醒软件

在工作中&#xff0c;我们总是不可避免地需要处理各种琐碎而重要的事项。然而&#xff0c;人的记忆力毕竟有限&#xff0c;尤其是在忙碌和高压的工作环境下&#xff0c;遗忘似乎成了一个难以避免的问题。想象一下&#xff0c;你因为一个疏忽忘记了一个重要的会议&#xff0c;或…

UE4_材质_雨滴涟漪效果ripple effect_ben教程

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 雨水落下时会产生这些非常漂亮的同心环波纹&#xff0c;我们要做的第一件事是创建一个单个的圆环遮罩动画&#xff0c;我们希望环在开始的时候在中心很小&#xff0c;然后放大&…