C经典书籍笔记——C陷阱与缺陷③(语意陷阱)_复制指针不会复制指针所指向的是一句-程序员宅基地

技术标签: c++  c经典书籍笔记  

目录

一、前言

二、字符指针

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

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后还会继续查找下去,陷入死循环

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/whc18858/article/details/120177244

智能推荐

unity3d与android交互:aar导出给unity:闪退,Theme.AppCompat.Light,appcompat-v7问题_unity3d 启动aar包的android activity不能显示-程序员宅基地

文章浏览阅读594次。unity接sdk,打包报错 No resource found that matches the given name ‘Theme.AppCompat.Light’.这是因为sdk中用了这个主题,冒然的删除,会导致后面出来的功能有问题使用appcompat-v7-23.0.0.aar解决,这个里面包含了资源,单纯的jar包不行appcompat-v7-23.0.0.aar可以通过androidsdk文件中SDKManager下载Unity接sdk,运行中报错java.lang.NoClassD_unity3d 启动aar包的android activity不能显示

DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting(CVPR2022 )_denseclip代码解读-程序员宅基地

文章浏览阅读891次,点赞23次,收藏26次。最近的进展表明,使用对比图像-文本对的大规模预训练可以从自然语言监督中学习高质量的视觉表示。得益于更广泛的监督来源,这种新范式表现出令人印象深刻的下游分类任务和数据集的可转移性。然而,将从图像-文本对中学到的知识转移到更复杂的密集预测任务的问题却很少被研究。在这项工作中,我们通过隐式和显式地利用来自CLIP的预训练知识,提出了一个新的密集预测框架。具体来说,我们将CLIP中的原始图像-文本匹配问题转换为像素-文本匹配问题,并使用像素-文本得分映射来指导密集预测模型的学习。_denseclip代码解读

open-spider开源爬虫工具:抖音数据采集_抖音直播爬虫采集_抖音爬虫网站-程序员宅基地

文章浏览阅读313次,点赞3次,收藏10次。基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**_抖音爬虫网站

HashSet和TreeSet的介绍和案例演示_演示hashset、treeset的使用方法、遍历、区别-程序员宅基地

文章浏览阅读254次。HashSet保证元素唯一 HashSet 底层数据结构是哈希表. HashSet 不是线程安全的 集合元素可以是 null ​ 哈希表:是一个元素为链表的数组,综合了数组和链表的优点 (像新华字典一样) (JDK1.7之前) 。 当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,..._演示hashset、treeset的使用方法、遍历、区别

Sublime text 3设置用用空格替换tab键_sublime 替换table-程序员宅基地

文章浏览阅读5.3w次,点赞4次,收藏8次。制表符,又爱又恨的。因为这个东西只用一个字符却能代替一个空间。但是有的开发工具却将制表符替换成空格,这样一来,我修改的代码别人的工具编辑后,就会出现很多不符的问题。导致代码混乱难以阅读。这时候,最好的方法就是将制表符统一。更关键的是如果你在写Python代码,那么会出现很多问题,Python是以严格的缩进和对齐来标识代码段的,但是混合使用空格和tab键,就会出现诸多问题,报各种各样的格式错_sublime 替换table

QVBoxLayout,QHBoxLayout不同部分比例大小设置方法 Python_qhboxlayout分配左右大小-程序员宅基地

文章浏览阅读7.6k次。#layout不同的比例区分大小 self.vbox.setStretchFactor(self.tableWidget1, 1) self.vbox.setStretchFactor(self.tableWidget2, 4)给tablewidget赋值 for i in range(len(valuelist)): ..._qhboxlayout分配左右大小

随便推点

Web基础(Java前端基础)_javaweb-程序员宅基地

文章浏览阅读1.2w次,点赞26次,收藏240次。1、Javaweb1.1 基本概念web开发:web,代表网页(网站)的意思,比如www.baidu.com静态web:列如静态web页面设计使用的:html,css。静态web性质:提供给所有人看的数据始终不会发生变化。动态web比如:淘宝、网易云、几乎所有的网站都使用动态web。它提供给所有人看到的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同。技术栈:Servlet/JSP,ASP,PHP。在Java中,动态web资源开发的技术称为Javaw_javaweb

vscode如何编译/运行拷贝来的c/c++项目?_vscode运行拷贝的项目-程序员宅基地

文章浏览阅读852次。在github下载了c/c++项目,但是却不知道如何进行编译并运行。_vscode运行拷贝的项目

el-upload 多文件上传_el-upload上传多个文件-程序员宅基地

文章浏览阅读3.2k次。el-upload 多文件上传_el-upload上传多个文件

php okhttp3 上传文件,Android使用OKHttp库实现视频文件的上传到服务器功能-程序员宅基地

文章浏览阅读715次。1 服务器接口简介此处我使用的服务器接口是使用Flask编写,具体实现代码:# -*- coding: utf-8 -*-from flask import Flask, render_template, jsonify, requestimport timeimport osimport base64app = Flask(__name__)UPLOAD_FOLDER = 'E:\myuploa..._okhttp3上传视频

VUE Axios 传递数组到基于SpringBoot的Java后台_vue传数组到springboot-程序员宅基地

文章浏览阅读5.1k次,点赞3次,收藏5次。背景前台使用axios.request({url: url,params: dataList,method: 'post'})传递数组到后台。后台使用RequestParam接收(String dataList)当数组长度非常小的时候可以进入后台,当数组长度大一点的时候前台报错400,不进后台。分析使用params传递参数实际上还是通过url传..._vue传数组到springboot

ImageNet VID-程序员宅基地

文章浏览阅读53次。有谁知道ImageNet VID数据集在哪可以下载吗。_imagenet vid

推荐文章

热门文章

相关标签