返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言之陷阱与缺陷详解
  • 954
分享到

C语言之陷阱与缺陷详解

2024-04-02 19:04:59 954人浏览 独家记忆
摘要

目录一、前言二、字符指针三、边界计算与不对称边界1.经典错误①2.经典错误②3、小结四、求值顺序五、运算符&& ||和!总结一、前言 二、字符指针 结论一:复制指

一、前言

二、字符指针

结论一:复制指针并不会复制指针所指向的内容。两个指针所指向位置相同,实际为同一个指针。

结论而:开辟两个数组,即使两个数组内容相同,地址也绝不相同。

三、边界计算与不对称边界

1.经典错误①


int main()
{
	int i = 0; int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	for (i = 0; i < 13; i++)
	{
		arr[i] = 0;
		printf("haha");
	}
	return 0;
}

计算的结果是程序陷入死循环

分析:

1.栈区默认先使用高地址,再使用低地址 

2.数组内元素随下标增长,地址由低到高变化

 调试后即可发现,i与arr[9]的地址相差3字节,所以i即为实际不存在的arr[12].

[补充知识:ANSI c标准允许这种用法——数组中溢界元素的地址位于数组所占内存之后,这个地址可以进行赋值和比较,但是不能解引用(若是数组之前存在溢界则语法不允许)]

2.经典错误②

十米长的围栏每一米就需要一根栏杆支撑,则共需要几根栏杆?                               11

3、小结

栏杆问题你若不假思索可能会回答为10。栏杆问题的根源正是加减一带来的困惑

对此我们坚持以下原则

原则一:考虑最简单的特例(如考虑20到10间有几个数,20-10还要+1吗。不妨考虑10到10有几个数)

原则二:仔细计算边界

而在实际编程中,一个编程技巧则可以"一言以蔽之",即不对称边界。

x>=0 && x<16  要优于 x>=0 && x<=15

不对称边界上界-下界就是之间所包含的数。

四、求值顺序

总结:C语言中只有四个运算符(&& ;|| ;?: ;,)明确规定了求值顺序

&&和||先对左边求值,只在需要时对右边求值:


if(y!=0 && x/y>a)

如此避免除0错误。

特别注意,赋值操作符不保证任何求值顺序,即使考虑了优先级和结合性,也会有意想不到的错误


int i=0;
while(i<n)
{
    y[i]=x[i++]
}

对于以上的代码,就不能确定y是否在i自增之前求值。

问题代码1:c+--c(我们可以根据"大嘴法"判断为c+(--c)),但c自增的先后不得而知)

问题代码2:int a=(++i)+(++i)+(++i)  (同理)

问题代码3:answer=func()-func()*func()    (我们不知道哪个func被先调用)

五、运算符&& ||和!

这三种运算符返回值都为0或1。在结果为真是返回1,结果为假是返回0。

考虑一下代码,其功能是查询表中一个特定元素


int i = 0;
while (i < tabsize && tab[i] != x)
{
	i++;
}

现分析将&&替换成&仍然能"正常工作"的原因。

原因一:只要xy的值都限制在0~1,x&&y和x&y的结果始终相同。

原因二:数组结尾之后的下一个元素,只要不改变他的值而仅仅是读取,没有什么大的危害

原因三:不同与&&的求值顺序,&要求两边都要被求值

如果tabsize大小等于tab中元素的个数,即使i=tabsize后还会继续查找下去,陷入死循环

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C语言之陷阱与缺陷详解

本文链接: https://lsjlt.com/news/135238.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言之陷阱与缺陷详解
    目录一、前言二、字符指针三、边界计算与不对称边界1.经典错误①2.经典错误②3、小结四、求值顺序五、运算符&& ||和!总结一、前言 二、字符指针 结论一:复制指...
    99+
    2024-04-02
  • C语言陷阱与缺陷之数组越界访问详解
    目录1.问题引入2、问题分析(1)理论分析(2)调试验证总结1.问题引入 一道经典的笔试题来了,请做好准备!!! 试问以下代码在Visual studio 2019环境下执行结果?原...
    99+
    2024-04-02
  • 如何理解Python陷阱与缺陷列表
    如何理解Python陷阱与缺陷列表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式。如...
    99+
    2023-06-17
  • Python陷阱与缺陷列表有哪些
    本篇内容主要讲解“Python陷阱与缺陷列表有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python陷阱与缺陷列表有哪些”吧!比如,Python程序员应该都遇到过的“UnboundLoc...
    99+
    2023-06-02
  • Python陷阱与缺陷列表的示例分析
    Python陷阱与缺陷列表的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式。如果一段代码...
    99+
    2023-06-17
  • C语言语义陷阱超详细梳理总结
    目录1 指针与数组2 非数组的指针3 作为参数的数组声明4 空指针并非空字符串5 边界计算与不对称边界6 求值顺序7 整数溢出8 为函数提供返回值1 指针与数组 C语言中只...
    99+
    2024-04-02
  • C语言进阶教程之循环语句缺陷详析
    目录前言1 循环语句的三要素2 使用不同循环语句实现六种排列组合2.1 第一种排列(ABC)2.2 第二种排列(ACB)2.3 第三种排列(BCA)2.4 第四种排列(CBA)2.5...
    99+
    2024-04-02
  • C++语法中的陷阱与解决方案
    C++ 语法中的陷阱与解决方案 C++ 是一门强大的编程语言,但它的语法也让程序员很容易陷入陷阱。本文将讨论 C++ 语法中的一些常见陷阱,并提供避免或解决它们的解决方案。 陷阱 1:...
    99+
    2024-05-13
    c++ 解决方案 陷阱 数据丢失 隐式转换
  • C语言的使用陷阱有哪些
    这篇文章主要讲解了“C语言的使用陷阱有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言的使用陷阱有哪些”吧!1. 正确理解函数声明你是否见过这样的代码“(*(void(*)())0)...
    99+
    2023-06-16
  • Go语言中Slice常见陷阱与避免方法详解
    目录前言slice 作为函数 / 方法的参数进行传递的陷阱slice 通过 make 函数初始化,后续操作不当所造成的陷阱性能陷阱内存泄露扩容前言 Go 语言提供了很多方便的数据类型...
    99+
    2023-02-14
    Go语言Slice常见陷阱 Go语言Slice Go Slice
  • PHP 多语言支持的常见陷阱和陷阱:提前避坑
    陷阱: 使用不同的编码(如 UTF-8、UTF-16)存储或显示文本时,可能会导致字符损坏或乱码。 对策: 在整个应用程序中始终使用一致的编码,并使用适当的编码转换函数。 2. 字符集支持 陷阱: PHP 并非支持所有字符集。如果应...
    99+
    2024-04-02
  • 程序员必知的Python陷阱与缺陷列表有哪些
    程序员必知的Python陷阱与缺陷列表有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式。如果一段...
    99+
    2023-06-17
  • 有哪些C++陷阱与套路
    这篇文章主要讲解了“有哪些C++陷阱与套路”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些C++陷阱与套路”吧!# 一、导语C++是一门被广泛使用的系统级编程语言,更是高性能后端标准开发...
    99+
    2023-06-16
  • 详解Mysql order by与limit混用陷阱
    在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N。但是这...
    99+
    2022-05-18
    Mysql order by与limit混用 Mysql order by与limit
  • Python的C扩展-应用与陷阱
    Python的C扩展-应用与陷阱 1. 背景 2. Python扩展的用武之地-库测试 (1)动态库的测试 (2)静态库的测试 3 python模块级扩展 4 小结 反馈建议 ...
    99+
    2023-01-31
    陷阱 Python
  • Python闭包与闭包陷阱举例详解
    目录1 什么是闭包2 闭包示例代码3 什么是闭包陷阱4 闭包陷阱代码实例4.2 第二组代码实例总结1 什么是闭包 在 Python 中,闭包是一种特殊的函数,它能够记住它所在的环境(...
    99+
    2023-01-28
    python中闭包的概念 python闭包详解 Python闭包
  • go语言中匿名函数的作用域陷阱详解
    众所周知在go语言中函数也可以当作变量在程序中使用,我们可以使用函数字面量在任何表达式内指定函数变量。但是在编写代码的时候请注意:如果一个函数在使用不是在该函数内部定义的变量时,这个...
    99+
    2024-04-02
  • 详解iOS Method Swizzling使用陷阱
    在阅读团队一项目源码时,发现Method Swizzling的写法有些瑕疵。这篇文章主要就介绍iOS Method Swizzling的正确写法应该是什么样的。 下面是iOS Met...
    99+
    2022-05-15
    iOS Method Swizzling
  • Go语言内存管理的优点与缺陷
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Go语言内存管理的优点与缺陷》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大...
    99+
    2024-04-04
  • 聊聊C语言中sizeof运算符的一个陷阱
    sizeof运算符通常用于获取变量或类型所占内存的大小(单位是字节) #include <stdio.h> struct D{ char a; int...
    99+
    2022-11-13
    c语言程序运算符sizeof sizeof c语言 C语言sizeof函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作