草庐IT

行为树

全部标签

c++ - int i = i ^ i 的值;它总是零或未定义的行为吗?

在下面的程序中,输出总是为零,还是未定义的行为?#includeintmain(){inti=i^i;std::cout用gcc4.8.0编译成功,输出0。 最佳答案 inti=i^i;由于i是一个自动变量(即它在automatic存储期限内声明),它未(静态)初始化但您正在读取它的值以(动态地)初始化它。因此,您的代码会调用未定义的行为。如果您在命名空间级别声明i或声明为static,那么您的代码就没问题了:命名空间级别inti=i^i;//declaredatnamespacelevel(staticstorageduratio

c++ - 这是 C/C++ 中的未定义行为吗

intfoo(intc){returnc;}intmain(void){inta=5,c;c=foo(--a)+a;}它会调用C/C++中的未定义行为吗?我认为不会。看完所有的答案我都搞不清楚是未定义行为还是未指定行为。 最佳答案 是的,这是未定义的行为-a和foo(--a)可以按任何顺序求值。如需进一步引用,请参阅SequencePoint.在完整表达式之后以及对foo的参数求值之后有一个序列点-但根据5/4,子表达式的求值顺序未指定:Exceptwherenoted,theorderofevaluationofoperandso

c++ - 为什么 '&' 会改变对象的行为?

我正在学习C++形式的ThinkinginC++V1。我遇到了一个演示继承的例子。就这样#includeclassInstrument{public:virtualvoidplay(){std::cout这会在控制台上输出Wind::play()。但如果我将方法“调整”更改为voidtune(Instrumenti){i.play();}输出将instrument::play()由于添加了'&'以便传递flute的引用而不是拷贝,为什么程序输出instrument::play()而不是Wind::play()? 最佳答案 因为传递的

c++ - 插入期间容器 std::set 的行为?

插入集合时,集合内部是否多次删除了某些对象?我试图在下面的程序中插入两个MyClass类型的对象,但令我惊讶的是它调用了具有初始插入值的类的析构函数2次!我无法理解这背后的任何逻辑。任何人都可以对输出给出一些想法吗?(突出显示为粗体)#include#include#includeusingnamespacestd;structMyClass{doublenum;~MyClass(){printf("Destructorcalled..forval:%lf\n",num);}};typedefint(*fun_comp)(MyClass,MyClass);intcomp(MyClass

c++ - GCC 的 std::sort 与 lambda 的不稳定行为

以下代码在使用GCC6.1.0编译时会生成段错误。奇怪的是,错误是一致的,但不会发生在较小的尺寸或略有不同的比较表达式上。你们知道为什么吗?#include#include#includeintmain(){intn=1000;std::vector>vec;for(inti=0;i((7*i)%3,(3*i)%5));}std::sort(vec.begin(),vec.end(),[](std::pairconst&p1,std::pairconst&p2){return(p1.first 最佳答案 尝试改变(p1.second

c++ - 这是 C++ 中的未定义行为吗?

我想知道下面最后一个if中对x的访问是否是未定义的行为:intf(int*x){*x=1;return1;}intx=0;if(f(&x)&&x==1){//something} 最佳答案 这不是未定义的行为,因为运算符&&是一个序列点 关于c++-这是C++中的未定义行为吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8852300/

c++ - uint32_t 和 uint8_t[4] 未定义行为的 union ?

这个问题在这里已经有了答案:PurposeofUnionsinCandC++(16个答案)关闭8年前。在thisanswer的评论中据说使用如下union将整数拆分为字节是未定义的行为。那个地方给出的代码与此类似但不完全相同,如果我更改了代码的未定义行为相关方面,请注明。unionaddr{uint8_taddr8[4];uint32_taddr32;};到目前为止,我认为这是一种很好的方法来执行addr={127,0,0,1};并在中获取相应的uint32_t返回。(我承认这可能会产生不同的结果,具体取决于我的系统的字节序。但是问题仍然存在。)这是未定义的行为吗?如果是这样,为什么?

c++ - g++-7.0/访问硬件中 constexpr 函数的不同行为

我使用以下代码访问某些MCU寄存器。#includestructMCU{structTimer{volatileuint8_tr1;templatestructAddress;};};templatestructMCU::Timer::Address{staticconstexpruint8_tvalue=0x25;};templateconstexprComponent*getBaseAddr(){returnreinterpret_cast(Component::templateAddress::value);}structTest{staticvoidfoo(){p->r1=42

c++ - 使用二维数组作为一维数组是否正确?可能导致未定义的行为等等?

这段代码正确吗?出于某种原因是否已弃用二维数组作为一维数组?chartab1[3][3];for(inti=0;i 最佳答案 Isusing2dimensionalarrayas1dimensionaldeprecatedforsomereason?当您按照您的方式使用tab1时,它会衰减为char(*)[3]类型的指针(指向3个chars).它不会衰减为char*。如果不显式转换它,您不能将它用作char*。Re:Isthiscodeproper?它的定义很好,因为对于代码中的tab1,&tab1、&tab1[0]和&tab1[0

c++ - X11 和 nVidia 驱动程序的奇怪 EGL 行为

我现在有一个奇怪的问题,我有这个使用GTK2、OpenGL和EGL的示例应用程序。我描述的奇怪行为只发生在带有官方nVidia驱动程序的Linux上的nVidiaGPU上。在程序中你看到一条注释,如果你在代码的这个点上不使用glFlush或glGetError,代码将不会绘制三角形,它只会显示红色(清晰的颜色)。如果您调用glGetError或glFlush,它会起作用。有人可以向我解释为什么会这样吗?这是代码:#include#include#include#include#includestaticEGLDisplayegl_display;staticEGLSurfaceegl_