我很早之前就知道,unsigned int与int运算的时候,int会被转化为unsigned int来进行运算。一直觉得定这条规则的人是极度反人类的,虽说unsigned int可以表示更大的正值,但毕竟我们不太会把unsinged想像成一个负数,而一个负的int数可能在无意间就变成了最大的正数。
所以,我对这个问题很慎重。小心翼翼地,一直没怎么出过错。直到有一天。
第一回合
那是一个阳光明媚的午后,我正惬意地刷leetcode。要遍历vector中除最后一个元素的所有元素。我这样写道:
for(int i=0;i<nums.size()-1;++i) bulabula;
没什么错吧?没错!提交的时候发现程序出现了内存访问错误。
作为一个自信的程序员,我自然想到了编译器出了问题。于是在VS上测试,是没有问题的!Stupid Leetcode!居然说我的代码有问题,我的代码怎么可能有问题?
就在我要放弃这一题的时候,我突然想到了边界条件,于是把nums清空再测试,VS提示内存访问错误。Soryy Leetcode,是在下输了……
在进行一番绞尽脑汁之后,我把目光聚焦在了size_t,查了资料后发现,size_t就是个unsigned类型,恍然大悟……nums.size()-1就等于最大的正数,i与之比较,肯定是符合条件的!OH NO!
第二回合
在经历了上述事情之后,我一般会这么写程序:
for(int i=0;i<(int)nums.size()-1;++i) bulabula;
再也没有出现过问题。每次看到别人还写我之前那样的代码,我都会会意一笑,然后告诉他人的我心得。直到有一天,我看到一个大牛写了这样的代码:
for(int i=nums.size()-1;i>=0;--i) bulabula;
我想我发现了大牛的错误。有了上次的教训,这次我测试了一下边界条件。什么?居然正常运行?
在想了很久之后,我得出以下结论:nums.size()-1的确得到了一个最大的unsigned int,可是把它赋给int的时候,编译器就傻傻地直接把unsigned int赋给了int,于是int就为-1了。大牛毕竟是大牛……
在学知识的道路上总会有羊肠小道,多走一些羊肠小道,我才能知道有没有近道!加油加油!
以上就是小编为大家带来的浅谈防不胜防的unsigned int的运算全部内容了,希望大家多多支持小牛知识库~
本文向大家介绍浅谈JS函数节流防抖,包括了浅谈JS函数节流防抖的使用技巧和注意事项,需要的朋友参考一下 在前端开发中有一部分的用户行为会频繁的触发事件执行,而对于DOM操作、资源加载等耗费性能的处理,很可能导致界面卡顿,甚至浏览器的崩溃。函数节流(throttle)和函数防抖(debounce)就是为了解决类似需求应运而生的。 函数节流(throttle) 函数节流就是预定一个函数只有在大于等于执
本文向大家介绍浅谈html转义及防止javascript注入攻击的方法,包括了浅谈html转义及防止javascript注入攻击的方法的使用技巧和注意事项,需要的朋友参考一下 有的时候页面中会有一个输入框,用户输入内容后会显示在页面中,类似于网页聊天应用。如果用户输入了一段js脚本,比例:<script>alert('test');</script>,页面会弹出一个对话框,或者输入的脚本中有改变页
本文向大家介绍浅谈PHP中的<<<运算符,包括了浅谈PHP中的<<<运算符的使用技巧和注意事项,需要的朋友参考一下 PHP中提供了<<<运算符构建多行字符串序列的方法,通常称为here-document或表示为heredoc的简写。 这种方法详细表述了字符串的字面值,并在文本中保留了字符串的下划线和其他空格(包括缩进)。例如: PHP解析器会将两个_END标签中间的所有内容输出,就相当于一个用双引
本文向大家介绍浅谈React前后端同构防止重复渲染,包括了浅谈React前后端同构防止重复渲染的使用技巧和注意事项,需要的朋友参考一下 什么叫前后端同构? 为了解决某些问题(比如SEO、提升渲染速度等)react 提供了2个方法在服务端生成一个HTML文本格式的字符串。在得到了这个HTML格式的字符串之后,通常会将其组装成一个页面直接返回给用户的浏览器。 到这里,服务端的活已经干完了,然后就是浏览
本文向大家介绍浅谈C#在网络波动时防重复提交的方法,包括了浅谈C#在网络波动时防重复提交的方法的使用技巧和注意事项,需要的朋友参考一下 前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同)。排查原因,发现是网络波动造成了重复提交。 由于网络波动而重复提交的例子也比较多: 网络上,防重复提交的方法也很多,使用redis锁,代码层面使用lock。 但是,我没有发现一个符合我心意的解决
我有一个引导弹出框,它在输入的