相关疑难解决方法(0)

未初始化的局部变量是最快的随机数发生器吗?

我知道未初始化的局部变量是未定义的行为(UB),并且该值可能具有可能影响进一步操作的陷阱表示,但有时我想仅使用随机数进行可视化表示,并且不会在其他部分使用它们.例如,程序在视觉效果中设置具有随机颜色的东西,例如:

void updateEffect(){
    for(int i=0;i<1000;i++){
        int r;
        int g;
        int b;
        star[i].setColor(r%255,g%255,b%255);
        bool isVisible;
        star[i].setVisible(isVisible);
    }
}
Run Code Online (Sandbox Code Playgroud)

是不是比它快

void updateEffect(){
    for(int i=0;i<1000;i++){
        star[i].setColor(rand()%255,rand()%255,rand()%255);
        star[i].setVisible(rand()%2==0?true:false);
    }
}
Run Code Online (Sandbox Code Playgroud)

并且还比其他随机数发生器更快?

c c++ undefined-behavior garbage

319
推荐指数
16
解决办法
2万
查看次数

是否默认将C++结构的成员初始化为0?

我有这个struct:

struct Snapshot
{
    double x; 
    int y;
};
Run Code Online (Sandbox Code Playgroud)

我希望x并且y为0.默认情况下它们是0还是我必须这样做:

Snapshot s = {0,0};
Run Code Online (Sandbox Code Playgroud)

将结构归零的其他方法是什么?

c++

189
推荐指数
5
解决办法
14万
查看次数

将C++对象传递给自己的构造函数是合法的吗?

我很惊讶地意外地发现以下工作:

#include <iostream>            
int main(int argc, char** argv)
{
  struct Foo {
    Foo(Foo& bar) {
      std::cout << &bar << std::endl;
    }
  };
  Foo foo(foo); // I can't believe this works...
  std::cout << &foo << std::endl; // but it does...
}
Run Code Online (Sandbox Code Playgroud)

我将构造对象的地址传递给它自己的构造函数.这看起来像源级别的循环定义.标准是否真的允许您在构造对象之前将对象传递给函数,还是这种未定义的行为?

鉴于所有类成员函数已经将指向其类实例的数据的指针作为隐式参数,我认为这并不奇怪.并且数据成员的布局在编译时是固定的.

请注意,我不是在问这是有用还是好主意; 我只是在修补一些关于课程的更多信息.

c++ constructor class undefined-behavior language-lawyer

109
推荐指数
2
解决办法
6633
查看次数

C++ 14中引入的哪些更改可能会破坏用C++ 11编写的程序?

介绍

随着C++ 14(又名C++ 1y)标准处于接近最终的状态,程序员必须问自己有关向后兼容性以及与此相关的问题.


这个问题

该问题的答案中,指出该标准有一个附录,专门用于有关修订之间变化的信息.

如果可以解释前面提到的附录中的这些潜在问题,或许在任何与那里提到的相关的正式文件的帮助下,将会有所帮助.

  • 根据标准:C++ 14中引入的哪些更改可能会破坏用C++ 11编写的程序?

c++ language-lawyer c++11 c++14

58
推荐指数
1
解决办法
5万
查看次数

初始化是否需要左值到右值的转换?是`int x = x;`UB?

C++标准包含一个半着名的例子,在3.3.2中的"令人惊讶的"名称查找,"声明点":

int x = x;
Run Code Online (Sandbox Code Playgroud)

这初始化x自身,(原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量).

这实际上是未定义的行为吗?

根据4.1"左值到右值转换",对未初始化的值执行左值到右值的转换是未定义的行为.右手是否x接受这种转换?如果是这样,示例实际上会有未定义的行为吗?

c++ initialization undefined-behavior language-lawyer

55
推荐指数
2
解决办法
2411
查看次数

默认变量值

如果我在声明它时没有为变量赋值,它是默认为零还是只是以前在内存中的任何内容?

例如

float x;
Run Code Online (Sandbox Code Playgroud)

c++

51
推荐指数
5
解决办法
6万
查看次数

在常量表达式中除以零

如果我在常量表达式中除以零,我的玩具编译器会崩溃:

int x = 1 / 0;
Run Code Online (Sandbox Code Playgroud)

C和/或C++标准是否允许这种行为?

c c++ compile-time-constant divide-by-zero constant-expression

43
推荐指数
3
解决办法
4102
查看次数

在不同的空格中使用具有相同名称的变量

此代码编译,但我在Visual Studio中有运行时错误:

运行时检查失败#3 - 正在使用变量'x'而未初始化...

int x = 15;
int main()
{
    int x = x;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白这种行为...当我点击继续时错误框中的程序恢复,x有一个损坏的内容(比如-8556328代替15).

为什么这段代码没有问题,并且int数组声明得很好?

const int x = 5;
int main()
{
     int x[x] = {1,2,3,4};
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

c c++ variable-declaration

40
推荐指数
3
解决办法
1704
查看次数

是否定义了在聚合初始化期间从后面的成员表达式引用早期成员的行为?

考虑以下:

struct mystruct
{
    int i;
    int j;
};

int main(int argc, char* argv[])
{
    mystruct foo{45, foo.i};   

    std::cout << foo.i << ", " << foo.j << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意foo.i在aggregate-initializer列表中的使用.

g++ 5.2.0 输出

45,45

这是明确定义的行为吗?是foo.i在这个聚集型初始化始终保证指存在创建结构的i元素(和&foo.i将指向内存地址,例如)?

如果我添加一个显式构造函数mystruct:

mystruct(int i, int j) : i(i), j(j) { }
Run Code Online (Sandbox Code Playgroud)

然后我收到以下警告:

main.cpp:15:20: warning: 'foo.a::i' is used uninitialized in this function [-Wuninitialized]
     a foo{45, foo.i};
                ^
main.cpp:19:34: warning: 'foo.a::i' is used uninitialized in this …
Run Code Online (Sandbox Code Playgroud)

c++ undefined-behavior language-lawyer c++11 c++14

35
推荐指数
2
解决办法
811
查看次数

C++中的声明点

101当我将之前的内容分配x给新的时,为什么不输出x

int x = 101;
{
    int x = x;
    std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出(垃圾):

422634

我认为第二个x将初始化为101 但它没有初始化.

注意:在这种情况下的解决方案是int x = ::x但问题是它发生的原因.

c++

33
推荐指数
2
解决办法
1705
查看次数