草庐IT

行为树

全部标签

c++ - const 引用转换为非常量后的行为

我对下面这段代码有些困惑。b如何仍然引用a但具有不同的值?#includeusingnamespacestd;intmain(){constinta=5;constint&b=a;++(int&)b;cout 最佳答案 此行为未定义。您可以合法地从非常量对象的常量引用中强制转换为常量;但是,从引用真实const的引用中转换为const-ness会导致未定义的行为。在这种情况下,编译器似乎创建了一个内存位置来存储5,以便为您提供一个可以引用b的位置,而变量a本身被优化为常量。您的代码非法修改了b引用的位置,生成了6,而行cout优化成

c++ - 条件运算符中的未定义行为

我不得不分享这个:由于以下涉及条件运算符的琐碎错误,我整整挂了2天电话。这是一个简单的更正,但我想知道:为什么有错误的代码可以编译?bug在做什么?为什么很难找到它?错误代码:std::mapmy_map;intkey_ctr=0;//...std::map::iteratorit_next=key_ctr==0?it_next=my_map.begin()//BUG!!!:it_next=--my_map.end();//BUG!!!!//.....很明显,我写错了条件运算符。当我终于找到并纠正这个错误时,一切都工作得很好:正确代码:std::mapmy_map;intkey_ctr

c++ - 奇怪的构造函数行为

我正在使用VisualStudio2013,这就是我想要弄清楚的:#include#includeusingnamespacestd;classA{public:intx=1;booly=true;A(int_x,bool_y):x(_x),y(_y){coutinit_list){cout输出是:Constructor#1Constructor#1Constructor#2Constructor#1第一次调用构造函数#1没问题现在Aobj2(int,string)调用构造函数#1的第二个构造很奇怪。编译器如何使用字符串参数调用(int,bool)构造函数?“假”bool甚至没有转换为

c++ - 后增量行为

最近,我将我的项目从gcc4.3升级到gcc5.5。在那之后,我看到后增量运算符的行为发生了变化,这导致了我的项目出现问题。我使用全局变量作为控制变量。例如,考虑这个示例程序:inti=0;intmain(){intx[10];x[i++]=5;===>culpritreturn0;}在上面的代码片段中,只有在将5分配给x[0]之后,i的值才应该递增,这样可以保证x[0]在i递增之前分配了一个正确的有效值。现在问题来了,我看到在迁移到gcc5.5之后,汇编指令发生了变化,甚至在赋值发生之前i的值就已经增加了。上述片段的汇编指令:Dumpofassemblercodeforfunctio

c++ - 当变量达到最大值时,unsigned int 的递增会导致未定义的行为吗

我的代码中有一个计数器,当它达到unsignedint最大值时,我希望我的计数器回到0。我用一小段代码进行了测试,它可以工作,但我不知道这是否是未定义的行为#include#includemain(){unsignedinta=0;a=~a;//Maxvalueofunsignedintprintf("%u\n",a);a=a+1;//isitallowedtoincrement"a"when"a"reachtheMax?printf("%u\n",a);//display0} 最佳答案 a=a+1;//isitallowedtoi

C++ 指针,++ 运算符行为

所以我在某处读到,如果我们有一个指针p,并且一些值i和j一个接一个地定义,那么堆栈上的那些值将一个接一个地然而,至少对我来说似乎并非如此。inti=10;intj=20;int*p=&i;p++;(*p)=30;std::cout相反,它会打印这些值102030如果我评论(*p)=30;而不是在*p中将是一个空地址。我认为++运算符在这种情况下会将我的引用从i更改为j并且(*p)将更改j的值,但显然不是这样。所以我想知道他们是什么意思? 最佳答案 您的代码的行为未定义。指针运算仅在数组内有效。您不能通过增加指向另一个对象的指针并取消

c++ - C++ 中 std::cout 的奇怪行为

#includeinta(int&x){x=-1;returnx;}intmain(){intx=5;std::cout为什么输出是“-15”?PS:编译器是:i686-apple-darwin11-llvm-g++-4.2(GCC)4.2.1(基于AppleInc.build5658)(LLVMbuild2336.11.00)PS:未做任何优化编译 最佳答案 在这一行中:std::cout未指定a(x)和x的求值顺序。发生的事情是未指定的行为,在您的情况下,编译器决定先评估x,然后再评估a(x)。

c++ - 这是 "*ptr++ = *ptr + a"未定义的行为吗?

好吧,我并不是真的很需要这个答案,我只是好奇。像*ptr++=a这样的表达式是完全有效的,因为我们正在操作两个对象ptr和*ptr但是如果我写*ptr++=*ptr+a它仍然有效吗?例如考虑以下片段:intmain(void){inta[]={5,7,8,9,2};int*p=a;*p++=76;/*alteringthefirstelement*/*p++=*p+32;/*alteringthesecondelement*/p=a;inti;for(i=0;i我认为表达式*p++=*p+32;没有什么可担心的,但我不确定所涉及的序列点。 最佳答案

c++ - 奇怪的 pow(x, y);行为

在做作业时,我注意到一些非常奇怪的事情,我只是想不通为什么。intx=5;cout结果是25。没问题。但是如果我这样写同样的程序:intx=5;inty=pow(x,2);cout结果是24!当x为2、3、4、6、7、8时没问题,但对于5、10、11、13等,结果比应有的低1。与if()相同。for(intx=1;x它打印出数字1、2、3、4、6、8、12、16。 最佳答案 std::pow()返回一个float。例如,如果结果是24.99999999并且您将其转换为int,它将被截断为24。这就是您在第二个代码示例中所做的。cou

c++ - 更改 Qt 布局中的调整大小行为

我希望我的自定义小部件在调整对话框大小时获得额外空间。当我只有少数小部件时,这是可行的,但是在添加更多这些相同小部件的列并将它们放在QGridLayout中后,额外的空间仅作为小部件之间的填充。 最佳答案 过去我遇到过这个问题,这里是我发现的一些事情:首先确保您要展开的所有小部件都将sizePolicy设置为“Expanding”。确保组成自定义小部件的小部件处于允许扩展的布局中。您可以通过将一个自定义小部件添加到窗口并查看它是否按预期扩展来检查这一点。确保您不想扩展的表单上的任何小部件在您希望它们保持静态的维度中具有固定(最小=最