C语言经典错误总结(一)

news2024/12/22 18:57:20

注:本文是结合《C陷阱和缺陷》所写!

一.=和==

我们都知道在C语言中=表示赋值操作符,==表示比较,那么你知道为啥单等号为=,双等号为比较吗?

这里扩展下:因为在C语言中赋值操作符相对于比较符号较常出现,因此字符较少的符号=就被赋予了更常用的含义---赋值操作。

但是这样的便利却带来了一个非常常见错误,赋值操作符和比较运算错用!

看案例:

#include <stdio.h>
int main()
{
	char c;
    scanf("%c",&c);
	while (c = ' ' || c == '\t' || c == '\n')
	{
		printf("hello\n");
	}
	return 0;
}

你猜猜结果为啥呢?

结果为无限循环,原因就是因为将第一个==错写成了=,导致出现下述情况:

||优先级大于=优先级(逻辑运算符优先级大于赋值运算符优先级),所以该式子:c = ' ' || c == '\t' || c == '\n'是将 ' ' || c == '\t' || c == '\n'表达式结果赋值给c,然后判断是否为真,是真就继续下循环,因此出现无限循环的情况。

在为大家写一种两者区分写的特殊情况:

#include <stdio.h>
int main()
{
	int x;
	int y;
	if (x = y)
	{
		;
	}
	return 0;
}
//目的是将y的值赋值给x,并判断新值是否为0

如果我们完成上述目的直接这样写,可能你所在的编译器不会报错,但实际这种代码是非常不可取的,我们可以这样写:

#include <stdio.h>
int main()
{
	int x;
	int y;
	if ((x=y)!=0)
	{
		;
	}
	return 0;
}

这样可以目的一目了然,也可以防止自己误判!

总结:

因此在写C语言代码用到=和==时,一定要问自己一句,到底要干什么!!!

二.词法分析之“贪心法”

我们知道C语言符号分为单字符符号和多字符符号,那么你知道计算机是如何判断连续的字符是哪种符号吗?比如:a+++++b如何区分呢?

C语言定义了一个符号规则:

每个符号应该包含尽可能多的字符!

简单理解就是编译器分解符号的方法是:从左向右一个字符一个字符的读入,如果该字符能够组成一个已存在的符号或一个符号的部分,就继续读取下一个字符,重复该操作直到读入的字符组成的字符串不再可能组成一个有意义的符号停止,该策略就为“贪心法”。

在这里补充一个知识:除字符串和字符常量,符号的中间不能镶嵌空白(空格符,制表符和换行符)

看案例:

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 3;
	int c = 0;
	c = a---b;
	printf("a---b=%d\n", c);
	a = 3; b = 3;
	c = a -- - b;
	printf("a -- - b=%d\n", c);
	a = 3; b = 3;
	c = a - -- b;
	printf("a - -- b=%d\n", c);
}

你能得出三个printf的结果吗?(联系上面的贪心法规则)

结果如下:

解释:

我们可以将上面的代码看成这样:

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 3;
	int c = 0;
	//c = a---b;
    c=(a--)-b;
	printf("a---b=%d\n", c);
	a = 3; b = 3;
	//c = a -- - b;
    c=(a--)-b;//忽略空格
	printf("a -- - b=%d\n", c);
	a = 3; b = 3;
	//c = a - -- b;
    c=a-(--b);
	printf("a - -- b=%d\n", c);
}

从而得到结果!

关于符号的准二义性还有这些:

y=x/*p;
y=x/(*p);

本意是将x除以指针p指向的值,再把所得的商赋值给y,结果写成了第一行的代码,显然,问题大了,在编译器中看到/*就会被认为代码注释的开始,直到找到*/结束,所以我们因该写成第二行。

这里我们再回到开头这题:

a+++++b;
//可以理解为((a++)++)+b;

三.对标准输入输出printf和scanf理解

我们直接看案例:

#include <stdio.h>
int main()
{
	int i = 3;
	printf("%d,%d\n", i++, i++);
}

结果为:

为啥呢?不应该是 3,4吗?

在这里我们必须知道标准输入输出规则:printf从右向左输出,scanf从左向右输入

因此我们是先算后面一个i++,在算前一个i++,结果为:4,3

学会了吗?

再看一个代码:

#include <stdio.h>
int main()
{
	printf("%d", printf("%d", printf("43")));
	return 0;
}

结果为:

这是因为printf也有返回值,返回值是输出的字符数~!

最后,希望大家C语言学习犯错越来越少,加油!!!

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

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

相关文章

【EI征稿中|JPCS独立出版】第七届机械、电气与材料应用国际学术会议(MEMA 2024)

第七届机械、电气与材料应用国际学术会议&#xff08;MEMA 2024&#xff09; 2024 7th International Conference on Mechanical, Electrical and Material Application (MEMA 2024) 2024年2月23-25日 长沙 MEMA会议属一年一度的国际学术盛会。因其影响力及重要性&am…

刷题第四十天 198.打家劫舍 213.打家劫舍Ⅱ 337. 打家劫舍Ⅲ

class Solution:def rob(self, nums: List[int]) -> int:#dp 偷到第i个房间&#xff0c;最多偷了多少钱#dp[i] max(dp[i - 1], dp[i - 2] nums[i])if len(nums) 1:return nums[0]if len(nums) 2:return max(nums[0], nums[1])dp [0] * (len(nums))dp[0] nums[0]dp[1] …

TestCase与TransactionTestCase的区别

目录 一、概述 二、区别 1、事务管理方式 2、性能影响 3、适用场景 三、示例代码 TestCase示例代码 TransactionTestCase示例代码 四、总结 TestCase与TransactionTestCase是Django框架中两个重要的测试类&#xff0c;用于对数据库操作进行测试。在编写测试用例时&…

SMART PLC开关量防抖滤波器

博途S7-1200PLC开关量防抖滤波器请查看下面文章链接: https://rxxw-control.blog.csdn.net/article/details/134936233https://rxxw-control.blog.csdn.net/article/details/134936233PLC系统自带的DI滤波器只能滤除一些高频干扰信号,对于一些物体检测,检测开关可能在物体边…

【头歌系统数据库实验】实验8 SQL的复杂多表查询-2

目录 第1关&#xff1a;基于派生表查询每个队员解答中超过他平均memory的user_id及题目编号problem_id 第2关&#xff1a;用ANY/ALL实现查询2019级选手&#xff08;user_id前4位为2019&#xff09;满足比2020级其中一个选手注册时间早即可的选手 第3关&#xff1a;用聚集查询…

使用Windows10的OneDrive应用程序,让文件管理上一个台阶

这篇文章解释了如何通过在文件资源管理器和OneDrive应用程序之间轮换&#xff0c;将OneDrive与Windows 10一起使用。 使用文件资源管理器进行组织 你不必将所有OneDrive文件都保存在硬盘上&#xff0c;事实上&#xff0c;你可以将任意数量的文件留在云中&#xff08;也就是微…

精通 JavaScript 数据处理大全:手写代码从入门到精通

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript- 数据处理 目录 1. 实现日期格式化函数 2. 交换a,b的值&#xff0c;不…

虚幻学习笔记11—C++结构体、枚举与蓝图的通信

一、前言 结构体的定义和枚举类似&#xff0c;枚举的定义有两种方式。区别是结构体必须以“F”开头命名&#xff0c;而枚举不用。 额外再讲了一下蓝图生成时暴露变量的方法。 二、实现 2.1、结构体 1、定义结构体 代码如下&#xff0c;注意这个定义的代码一定要在“UCLASS()”…

南京大学-软件分析-课程03-数据流分析

1. Overview of Data Flow Analysis Data如何在CFG上流动&#xff1f; 应用程序特定的数据是如何通过 CFG&#xff08;程序的控制流图&#xff09;的节点&#xff08;基本块/语句&#xff09;和边&#xff08;控制流&#xff09;流动的。 may analysis: outputs information …

Synchronized 优化

目录 前言 重点 一、 轻量级锁 二、锁膨胀 三、重量锁 四、偏向锁 五、其他优化 我的其他博客 前言 Java synchronized 是一种机制&#xff0c;可以保证多个线程在访问共享资源时的同步性。synchronized 关键字可以用于方法或代码块上&#xff0c;当一个线程获取了这个对…

Http模块

Http模块 1.创建http服务 //导入http模块 const http require(http)//创建服务对象 const server http.createServer((request,response)>{response.end(Hello HTTP Server) })// 监听端口&#xff0c;启动服务 server.listen(9000,()>{console.log(服务已启动....);…

代理模式:解析对象间的间接访问与控制

目录 引言 理解代理模式 不同类型的代理模式 代理模式的应用场景 代理模式的优缺点 优点 缺点 实际案例&#xff1a;Java中的代理模式应用 结语 引言 代理模式是软件设计模式中的一种结构型模式&#xff0c;旨在为其他对象提供一种代理以控制对这个对象的访问。它允许你…

【Linux】less 命令使用

less命令 less 与 more 类似。 less是一个非常常用的文本查看工具&#xff0c;它可以用于查看任意大小的文本文件&#xff0c;支持滚动翻页、搜索、标记等功能。在本文中&#xff0c;我们将详细介绍less命令的用法、参数和实例&#xff0c;并对其背后的原理和相关技术进行简要…

局域网上网行为监控软件有哪些(功能介绍大全)

作为老板的你&#xff0c;是不是经历过这些事情&#xff1a; 员工上班时间总是利用公司电脑摸鱼&#xff1b;公司的网络被人占用&#xff1b;员工上网行为异常&#xff1b;员工的工作状态不饱和&#xff0c;总是懒散…… 不可否认&#xff0c;现在的员工越来越难管理&#xf…

张驰咨询:数据驱动的质量改进,六西格玛绿带在汽车业实践

尊敬的汽车行业同仁们&#xff0c;您是否曾面临生产效率低下、成本不断攀升或顾客满意度下降的困扰&#xff1f;本期专栏&#xff0c;我们将深入探讨如何通过六西格玛绿带培训&#xff0c;在汽车行业中实现过程优化和质量提升。 汽车行业的竞争日趋激烈&#xff0c;致力于提供…

vue 实现点击复制文本到剪贴板

vue 实现点击复制文本到剪贴板 共四种方法 1. navigator.clipboard.writeText该方法需要在安全域下才能够使用&#xff0c;比如&#xff1a;https 协议的地址、127.0.0.1、localhost <template><div><el-button type"primary" click"btn1"…

互联网公司,哪个部门才是鄙视链最顶端?

文章目录 每日一句正能量前言财务部法务部公关部销售部前台行政IT部创意部后记 每日一句正能量 我们必须在失败中寻找胜利&#xff0c;在绝望中寻求希望。 前言 在互联网公司中&#xff0c;不同职位的鄙视链是存在的。有些职位享有高尚的地位&#xff0c;而有些则被看作是次要…

弧光保护能应用在船舶中压配电板?

摘要&#xff1a;船舶中压配电板弧光故障导致的设备损坏和停电事故&#xff0c;不仅会造成较大的经济损失&#xff0c;而且严重影响船舶电站的安全稳定运行&#xff0c;威胁船舶电站操作人员的安全。弧光保护是基于电力系统开关柜发生弧光故障时而设计的一套母线保护系统&#…

[基础IO]文件描述符{C库函数\系统接口\初识fd}

文章目录 1.基础知识1.1对文件的认识1.2对系统调用接口的认识1.3如何理解LInux下一切皆文件? 2.C语言的库函数2.1FILE *fopen(const char *path, const char *mode);2.2对fopen()的mode的w/a的深层认识2.3fclose()2.4size_t fwrite(const void *ptr, size_t size, size_t nmem…

固态硬盘无法识别?三大方法帮你搞定

随着科技的迅猛发展&#xff0c;固态硬盘&#xff08;SSD&#xff09;已成为许多计算机用户首选的存储设备。然而&#xff0c;有时我们可能会遭遇固态硬盘无法识别的问题&#xff0c;这给用户带来了不便与困扰。本文将深入研究固态硬盘无法识别的原因&#xff0c;并为您提供三种…