我知道未初始化的局部变量是未定义的行为(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)
并且还比其他随机数发生器更快?
我有这个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)
将结构归零的其他方法是什么?
我很惊讶地意外地发现以下工作:
#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++ 14(又名C++ 1y)标准处于接近最终的状态,程序员必须问自己有关向后兼容性以及与此相关的问题.
这个问题
在该问题的答案中,指出该标准有一个附录,专门用于有关修订之间变化的信息.
如果可以解释前面提到的附录中的这些潜在问题,或许在任何与那里提到的相关的正式文件的帮助下,将会有所帮助.
C++标准包含一个半着名的例子,在3.3.2中的"令人惊讶的"名称查找,"声明点":
int x = x;
Run Code Online (Sandbox Code Playgroud)
这初始化x自身,(原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量).
这实际上是未定义的行为吗?
根据4.1"左值到右值转换",对未初始化的值执行左值到右值的转换是未定义的行为.右手是否x接受这种转换?如果是这样,示例实际上会有未定义的行为吗?
如果我在常量表达式中除以零,我的玩具编译器会崩溃:
int x = 1 / 0;
Run Code Online (Sandbox Code Playgroud)
C和/或C++标准是否允许这种行为?
c c++ compile-time-constant divide-by-zero constant-expression
此代码编译,但我在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) 考虑以下:
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) 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但问题是它发生的原因.