number2+=number1+number2;
这句,number2 += number1 ,这个其实就已经是number2 = number2 +number1
"+="这个符号的意思你应该知道吧
如例:a=a+1 和 a+=1 是一样的。
当然,如果你想让你上面的等式成立,可以写成
number2+=(number1+number2),
不过这个是number2=number2+(number1+number2)
#include<iostream>
struct
{
int year(0);
int month(0);
int day(0);
int hour(0);
int minute(0);
int second(0);
}Time;
int main()
{
using namespace std;
cout << "请输入年:";
while(!(cin >> Timeyear) || (Timeyear < 0 || Timeyear > 2007)){
cout << "错误的输入,请重新输入:";
cinclear();
cinignore(1024,'\n');
}
}
或者
#include<iostream>
struct
{
int year(0);
int month(0);
int day(0);
int hour(0);
int minute(0);
int second(0);
}Time;
int main()
{
using namespace std;
cout << "请输入年:";
while(!(cin >> Timeyear) || (Timeyear < 0 || Timeyear > 2007)){
cout << "错误的输入,请重新输入:";
cinclear();
while(cinget != '\n')
continue;
}
}
其他的代码你可以照着我给你的方法去写。
讲解例子:
#include <iostream>
using namespace std;
int main(){
char a;
cin >> a;
int b;
while(!(cin >> b));
}
在这个例子中,程序给出了2次输入,如果你连续输入两个char字符的话,那么while就会无限循环。为什么呢?
首先cin *** 作符对于char类型每次只能读取一个字符,如果连续输入ac,则cin只把字符a读取到char变量a中;对于整形和浮点型每次只能读取一个数,如果连续输入1 2(1和2之间是空格),则cin只把1读到int型变量b中。
但是而剩下而没有读取的b和2呢?不要认为它们对程序并没什么作用,其实它们仍被留在了输入缓冲区(buffer)中!
这里需要介绍一下缓冲区,其实缓冲区就是一块内存,输入不直接写入硬盘而写入内存是为了提高效率,减少硬盘的读写次数;如果在同一程序中经常使用输入和输出而不通过缓冲区的预存直接让硬盘读入和写出数据的话,不仅速度慢,而且造成了硬盘的不必要磨损,缓冲区正是为了解决这2个问题而被设定。输入和输出流都有缓冲区。
回过头来,如果输入ac,则c将被留在了缓冲区中,而cin正是从缓冲区中读取输入,这意味着下一次对输入的读取将会是缓冲区中的c,由于c一个字符,与变量b的类型不符,cin >> b 会检查读入的类型是否正确,并返回一个bool值。当cin要读取一个int类型变量时,它在缓冲区中发现的却是字符c,但它并不会停止读取,它仍然读取了字符c并将其隐式地转换为c的ASCⅡ码,由于类型不符合,它返回了一个false值(cin其实是一个函数,iostream 类对 << *** 作符进行了重载),所以语句while(!(cin >> b));就成了无限循环,由于cin每次都从buffer中读取字符c并返回一个false值,这就造成了while的条件始终为true。
你所说的屏幕上出现很多的错误提示其实就是上面我所描述的情况,可能你在输入的时候连续输入了几个数字比如 -1 20000 ,这样由于-1不满足条件所以进入while循环而cin每次都读取数字20000,同样不满足条件于是便进入了无限循环。
解决的方法是在while中加入cinclear()和cinignore()或者使用面的第二种方法;cinclear()是清除由于输入读取失败而设置的失效位failbit,我说的例子中要当cin返回false值的时候就会自动设置失效位。失效位会锁定输入,使下一次的cin无法完成读取。
cinclear()的作用就是清除由于失败的输入而生成的失效位,使下一次输入可以正常读取。该函数带一个默认参数ios::goodbit,其实就是0值。
cinignore()接受2个参数,第一个是一个整数,第二个是一个字符,比如cinignore(3,'c')的作用就是把输入中字符c之前的其他字符给ignore(无视)了,每次执行后都累加执行次数并和3作比较,更为通常的用法是将第一个参数设置的足够大,比如cinignore(1024,'\n')就是将读入的在换行符之前的所有字符(只要你输入的内容小于1024字节)都忽视掉,用在我给你的解决方法里就是把从缓冲区里读取的数据给无视了,也就不会无限循环。
同理,第二中方法里调用了一个cinget来读取一行中所有的输入,仅当读取到行尾(由enter键生成的'\n')时才结束循环,这种方法的理念和在main()函数的末尾加一个cinget()来读取下一次键击从而防止程序一闪而过是相同的。在这里它的作用就是防止下一次的cin因读取了缓冲区中未被读取的字符而造成while的无限循环。
还有一点我要告诉你的是你在自学用的书不符合最新的C++标准。这一点从你用的头文件名就可以看出,C++标准库文件的h形式已经被明确废弃,而且void main()的写法也是不合法的,标准的应该是int main(),main()返回值可选。另外不管是什么类型都要养成初始化的习惯,初始化绝对不会给你带来任何损失,而且还能有效地避免由未初始化而带来的bug(我亲历过寻找这类bug之痛苦),但也不是必须,你只要保证每次在使用该变量的时候对它进行初始化就可以了(比如用cin初始化 )。只是我已经习惯了所以对你的结构动了下手脚。
看来你也是遭了国内IT教材的殃,国内的甚至有些大学用的IT教材都已经和最新的IT发展严重脱节,而且有些个教材讲的也不是很详细,从你来问这样的问题就可以看出。奉劝你还是找一本国外的经典教材做枕边书,象C++ primer 和 C++ primer plus 这一类的,这并不是崇洋媚外,这叫“师夷长技以自强”,谁叫核心的技术都掌握在人家老外手里呢?
呵呵废话有点多了,但希望你能就此解决问题。新人难免会遇到不少问题,我也是刚学3个来月。第一次打那么多字,真累!!
这让我想起了自己曾经做程序员的苦逼日子,那一次遇见的BUG超级头疼。让我现在都记忆犹新。从发现bug 到最终解决耗时一个月,当时项目已经马上要发版本,所以期间每天搞到12点。累计投入1个专职测试,最高峰时期有一个10人的攻关小组,这很菊花厂,其中一半以上的都是senior developer,一个价值上百万的bug。调试的难度可以说是灾难级的,让我来回忆一下自己的经历吧。
1数据不一致,很难测试
测数据库一致性的用例一般用转账的例子,例如A给B转10块钱,那就需要把A的账户余额减10,再给B的账户余额+10,然后再判断一下A和B总的账户余额不变。当然你也可以扩展到多个表,但是基本原理类似。我们的测试是用TPCC,所以一致性使用的是TPCC的业务模型,模拟往TPCC的warehouse之间出货,然后查库存是否一致。为了尽量模拟用户的真实使用场景,当然得导入大量的数据,加大并发,中间还会故意模拟各种故障。 所谓的各种故障,说白了也无非是杀进程,下电,模拟磁盘故障,因为Taurus又是一个分布式的数据库,网络故障必不可少,模拟网络抖动,丢包,网络割裂。
2定位和解决
最开始接手这个问题的时候,首先当然是看测试测的对不对了,因为之前也乌龙过几次,测试一开始导入的数据就有部分不成功,导致一致性检查一开始就没通过。确认问题后,就开始定位。首先我们想的是找到重现条件,好吧,那就开测吧,搭个环境,导个数据,1天下来也是能够重现一次的。那不一致的日志有没有什么特征呢?插入的数据有上千万条,每次测试出来的不一样的记录,连不一样的表都不重样。
总之,遇见问题一定要冷静,仔细分析,询问老前辈。最后祝愿你能解决每一个难题!
将
int create(struct Record p, int num)
改为
int create(struct Record & p, int num)
加一个引用
作为一个程序员,你发现同事写的代码有Bug,你会告诉他吗?讲真的,这个事情对我来讲,很难,因为我在这个事情上吃过苦头!
看待这个问题首先得看对方脾气咋样,如果对方脾气不好,或者很难搞,还是想想其他办法。直接跟他讲可能会遭到对方的白眼!
别看我们程序员一个个傻傻呆呆的,其实自尊心特别强!除非你是他的领导,否则即使你发现了他代码里的Bug,他也不会服你!虽然还是会改,但内心一定在想:“就你能?自己管好你自己就成,看我代码干啥?”
其实我也是这样的心理,好像程序员除非自己愿意,否则都不怎么喜欢别人去研究自己的代码,好像对方故意找自己茬的意思。
但是不管咋样,不管是有意无意,我们既然发现了同事写的代码有问题,就不能坐视不管!
我最近在调一个小伙伴的接口时,因为涉及到数据回滚,所以就想知道他的代码有没有做回滚 *** 作。如果没有,可能我这边数据已经回滚了,他那边没回滚就会导致数据前后不一致。所以我也不是有意要审查他的代码。
然后我就发现他不光没有做回滚 *** 作,也没有做批处理。几个涉及到修改数据的代码就这样一行一行走下来,看着直让人挠后脑勺。
于是我就把这个事情告诉了他,让他要么做事物(如果 *** 作有问题,可以自动回滚),要么做主动回滚。否则我在调他接口时,如果我这边撤销了数据修改,他那边却提交了修改,就会导致数据丢失或前后不一致。
当我告诉他这个情况和解决方案以后,我能很明显地感受到他有点不愉快。但事实摆在眼前,也只能修改。可修改归修改,他还是有点脾气的。于是他写了一个事物,将大部分涉及到增删改的语句全部包在了里面,唯一把一个删日志的语句留在了外面。
我看到这个情况,就委婉地跟他说:“”好像这个删日志的语句也要包在事物里面哦!”
但是他却说,这个无关紧要,他特意放在外面的。
我跟他说,既然这里有数据存在,就不是无关紧要的。不管咋样,也不能无缘无故就把数据给删了。但是他很倔强,执意不改,还说如果我觉得这个数据有用,那就让我自己“顺手”把这里的代码改一下。
此时我能明显地感受到他已经有点烦我了!无奈之下,我把这段代码给移动到了事物里面。
而我为什么说我因为发现同事代码有Bug告诉同事而吃过亏呢?
原因在于我之前待过的一家公司,有一个工作了几年的程序员同事,而我当时是个萌新。因为我专门培训过,所以代码能力还行。可这个同事虽然工作了几年,但写出来的程序代码却Bug一堆,常规测试手段还测不出来。
我是在偶然之间发现他写的一个程序是有Bug,但是又不确定,所以就想看看他代码是咋写的。不看不知道,一看吓一跳,他写的好大一部分代码都有问题!
我当时初生牛犊不怕虎,发现一个跟他说一个,结果最后把他给惹毛了,当场就要跟我动手,说我专门针对他。我哪有针对他的心呀!我当时想的是把这些Bug找出来,让他改掉,否则对公司也不好。
但是他想的估计是被我这个萌新发现了一堆Bug很丢人。我总是针对他的代码找Bug,他就是脾气再好也绷不住啊!
后来我们的部门经理为了不让他难堪,也为了给他个台阶下,找了我写的程序里的一个缺点,猛批了下,然后跟大家说:“我刚才看了看,大家写的代码有好多问题。这样,大家都各自检查一下自己的代码,看看有没有问题,有问题尽快改过来,然后我们统一测试!”
直到现在,我也没学会当发现同事代码有Bug以后,在不让同事产生不愉快的心理的情况下,委婉地告诉同事他代码写的有问题的方法。
1,PayPal 意外向某人支付 92 千万亿美元。2,千年虫,炒作的狂欢。3,宰赫兰导d事件,毫秒的误差。4,公尺还是英尺?火星气候探测者号的星际迷航。5,阿丽亚娜5型运载火箭,昂贵的简单复制。
PayPal 意外向某人支付 92 千万亿美元。
当 Chris Reynolds 打开他的 PayPal 电子邮件对账单时,这位宾夕法尼亚州公关主管的账户余额显示为 92,233,720,368,547,800 美元。在 64 位数字的世界里,这个数字太过庞大,意味着存在编程错误。所幸这一错误很快就被发现,当他再次登录时,他的账户已经归零。PayPal 表示愿意为 Reynolds 选择的事业捐赠一笔数额不详的资金。
千年虫,炒作的狂欢。
千年虫或 2000 年问题是指与 2000 年开始的日历数据的存储和格式化有关的事件。由于许多程序在表示四位数年份时只用最后两位数字表示,结果,2000 年和 1900 年无法区分,因此预计会出现问题。
例如,它影响到了每天计算利率的银行、核电站、医院、交通运输等中心以及很多其他方面。为纠正这一错误,全世界耗费了数十亿美元来升级计算机系统。
宰赫兰导d事件,毫秒的误差。
在1991年2月的第一次海湾战争中,一枚伊拉克发射的飞毛腿导d准确击中美国在沙地阿拉伯的宰赫兰基地,当场炸死28个美国士兵,炸伤100多人,造成美军海湾战争中唯一一次伤亡超过百人的损失。
在后来的调查中发现,由于一个简单的计算机bug,使基地的爱国者反导d系统失效,未能在空中拦截飞毛腿导d。当时,负责防卫该基地的爱国者反导d系统已经连续工作了100个小时,每工作一个小时,系统内的时钟会有一个微小的毫秒级延迟,这就是这个失效悲剧的根源。爱国者反导d系统的时钟寄存器设计为24位,因而时间的精度也只限于24位的精度。在长时间的工作后,这个微小的精度误差被渐渐放大。在工作了100小时后,系统时间的延迟是三分之一秒。
对一般人人来说,033秒是微不足道的。但是对一个需要跟踪并摧毁一枚空中飞d的雷达系统来说,这是灾难性的——侯赛因飞毛腿导d空速达42马赫(每秒15公里),这个”微不足道的”033秒相当于大约600米的误差。在宰赫兰导d事件中,雷达在空中发现了导d,但是由于时钟误差没有能够准确地跟踪它,因此基地的反导d并没有发射。
公尺还是英尺?火星气候探测者号的星际迷航。
火星气候探测者号在1997年发射,目的为研究火星气候,但是它没有能够达成这项花费3亿多美元的使命。
探测者号在太空中飞行几个月以后,由于导航错误,最终在火星大气层解体。探测器的控制团队使用英制单位来发送导航指令,而探测器的软件系统使用公制来读取指令。这一错误大大改变了导航控制的路径。最后探测器进入过低的火星轨道(大约100公里误差),在过大的火星大气压力和摩擦下解体。
1996年6月4日,阿丽亚娜5型运载火箭的首次发射点火后,火箭开始偏离路线,最终被逼引爆自毁,整个过程只有短短30秒。阿丽亚娜5型运载火箭基于前一代4型火箭开发。在4型火箭系统中,对一个水平速率的测量值使用了16位的变量及内存,因为在4型火箭系统中反复验证过,这一值不会超过16位的变量,而5型火箭的开发人员简单复制了这部分程序,而没有对新火箭进行数值的验证,结果发生了致命的数值溢出。
发射后这个64位带小数点的变量被转换成16位不带小数点的变量,引发了一系列的错误,从而影响了火箭上所有的计算机和硬件,瘫痪了整个系统,因而不得不选择自毁,4亿美金变成一个巨大的烟花。
以上就是关于刚接触java,对某程序源代码有疑问。很简单的问题,希望师哥师姐帮忙解答,寻找此 java 程序的 BUG全部的内容,包括:刚接触java,对某程序源代码有疑问。很简单的问题,希望师哥师姐帮忙解答,寻找此 java 程序的 BUG、自学成材好难啊,但是我发现我编写的一个程序里有BUG(无意中发现的),怎么解决、你们工作中遇到过什么诡异的bug,最后怎么解决的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)