假设我们有一个模板类:
template<typename T>
class X
{
public:
static T t;
static T foo()
{
return t;
}
};
这样的静态成员初始化有什么区别t
double X<double>::t = 5.0f;
以及类专业化(或静态成员!?)的此类初始化?
template<>
double X<double>::t = 5.0f;
假设我们有一个模板类:
template<typename T>
class X
{
public:
static T t;
static T foo()
{
return t;
}
};
这样的静态成员初始化有什么区别t
double X<double>::t = 5.0f;
以及类专业化(或静态成员!?)的此类初始化?
template<>
double X<double>::t = 5.0f;
众所周知,如果没有运算符,sizeof则可以计算数组元素的个数,例如,像这样:
int arr[10];
size_t size = *(&arr + 1) - arr;
在哪里
arr是指向第一个元素的指针
&arr有一个指向整个数组的指针
&arr + 1在我们的数组之后有一个指向下一块内存的指针
*(&arr + 1)是数组最后一个元素之后的元素的地址。
因此,指针的差异给出了它们之间的元素数量。
问题:
这不会*(&arr + 1)导致UB?
如何&arr有指向整个数组的指针?它是由标准定义的吗?
这是一个经常讨论的话题,但我还是想更具体地了解它在UB哪里,不在哪里。
下面是几个例子,我的想法是:
int i = 0, x = 1;
int a[6] = {0, 0, 0, 0, 0, 0};
i = ++i + ++i; // UB
i = i++ + ++i; // UB
x = i++ + ++i; // ?? я думаю что UB
x = i++ + i++; // OK
a[i] += i++; // OK ??
a[++i] = i++; // UB ??
a[++i] = ++i // UB
i += ++i; // UB
j += j; // OK
一直以来,我都澄清了一个规则——如果在一个表达式中,对象的值改变了不止一次——UB纯水,也就是说,很明显,在某些平台上可以而且将会发生预期的事情,但问题是这种情况下的标准不保证任何东西——也就是说,它要么说它是undefined behavour,unspecified behavour要么implementation defined behavour。
问题是 - 这些示例中是否还有其他情况UB?
任务是找到函数的值
对于一组无序的 128 位数字,Ak每个数字表示为
Ak = 2^96 * a1k + 2^64 * a2k + 2^32 * a3k + 2^0 * a4k,
在哪里
0 <= aik <= 2^32 - 1
a
log10(X)是数的十进制对数的整数部分X,
我们假设log10(0) = 0
一个N <= 5000
例子:
2 // N - кол-во чисел этого набора
0 0 0 2324 // коеффициенты aik для текущего Ak
0 2332 0 0
总和值 - 44
问题:
k != j??因为如果它相等那么将数字与自身进行异或运算的意义何在,因为它也会给出0从零开始的对数0实际上,对于这个例子,我得到了以下信息
A0 - 0 0 0 2324
A1 - 0 2332 0 0
A0 XOR A1 = 0 2332 0 2324
тогда X = 2^96*0 + 2^64+2332 + 2^32*0 + 2^0+2324 = 4.301780718×10²²
но отсюда log10(X) != 44
我究竟做错了什么 ?
产生 44 的正确算法是什么?
假设有一个边长为 的正方形a和一个边长为 的等边三角形b。
让我们将正方形想象成地面上的一种孔区域,平面形状可以下降到其中(在我们的例子中是等边三角形)。
这个三角形在什么情况下可以放在里面呢?
刻字的规则绝对是任意的,而三角形可以在空间中任意旋转和移动。
这段代码是如何工作的还不清楚
int a[] = {4, 5, 2, 3, 1};
int i = *a;
for (;i;)
{
std::cout << i--[a]; // не понятная строчка
}
// output: 1325
减量适用于什么?
i好吧,很明显,一旦循环结束,变量。
但是如何访问数组元素呢?为什么没有编译错误?
人生第一次遇到这样的代码
需要将二维图形(最多 500 万个实点)显示为曲线。
就渲染性能而言,Qt 中的哪个工具适合?
我正在考虑使用它QGraphicsView,QGraphicsScene但我不确定渲染的能力和速度
它使用硬件加速吗?
还是在 CPU 端呈现?
当然,作为一个 lobogo 选项,你可以直接渲染图形通过raw OpenGL API
但我不想做得太过分,也不想让一切都过于复杂,而是通过最佳解决方案来解决。
附言
根本不考虑为显示图形而锐化的现成选项/组件,因此不提供它们
N原点分别在平面上的给定线段(0, 0),其位置绝对可以是任意的
最后一段将被称为红色。
需要判断红色线段是否从该点可见,(0, 0)或者是否被遮挡(被其他线段/线段覆盖)。
为清楚起见,图片:
在这里你可以看到,如果 1 或 2 是红色,那么它们是可见的;(0, 0)
如果红色是 3 或 4,那么它们是不可见的
实际上,我的解决方案 (O(N)) 如下:
由red红色(最后)段表示,由red.start和red.end表示红色的相应末端,然后如果至少有一个段
(0, 0), (red.start)并且(0, 0), (red.end)不与任何非红色线段相交,则从原点可见,否则不可见。
也就是说,问题被简化为正确定义线段的交集。
总的来说,我实现了它——一切正常(如果有兴趣我可以展示代码)。
对其他算法的工作原理感兴趣,例如,在对数时间内?或者对于线性但采用不同的方法?
编辑
原来这个算法是不正确的,没有考虑到红色段左右部分闭合,中间可见的情况
考虑以下 C++03 标准的代码:
struct A
{
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
void foo() { cout << "foo()" << endl; }
};
int main(int argc, char** argv)
{
A* pa = (A*)0;
pa->foo();
return 0;
}
编译和运行得很好。
出现了以下问题:
1)为什么程序会因为方法的虚拟版本而foo崩溃?
2)如何使用C++11安全调用非静态方法foo,使方法foo有效传递this,从而避免UB使用时?
最近接触js不多,所以忘记了很多东西,现在碰到一个看似微不足道的任务。
函数的主体应该是什么,以便输出与代码中的注释相同
var summator = function(val) {
//
};
console.log(summator(1)); // 1
console.log(summator(5)); // 6
console.log(summator(3)); // 9
直到我做出一个相当集体农场的决定
var summator = function(val) {
if (typeof summator.sum === 'undefined')
summator.sum = 0;
summator.sum += val;
return summator.sum;
};
如何写闭包?
这段代码编译得很好。
class
{
public:
//...
} anonymous;
为什么以及出于什么目的使用未命名的类?
此代码无法编译:
std::shared_ptr<MyType> pi = new MyType[5];
相反,由于声明了构造函数shared_ptr,explicit您必须编写:
std::shared_ptr<MyType> pi(new MyType[5]);
至少我觉得不方便。
这样设计的原因是什么?
这有什么好处?
我想了解在一般情况下哪些规则决定了表达式值的评估顺序。
假设有这样的代码
int readValue()
{
int v;
cin >> v;
return v;
}
int main()
{
cout << readValue() << ' ' << readValue() << '\n';
return 0;
}
如您所知,移位运算符是从左到右计算的-但是当您输入1 2输出时2 1(Microsoft的编译器),这是什么原因?
这段代码是生成undefined behaviour还是只是输出顺序未定义?
如果你删除阅读代码——一切都是可以预见的
int readValue(int v)
{
return v;
}
int main()
{
cout << readValue(1) << ' ' << readValue(2) << '\n';
return 0;
}
结论 -1 2
怎么了 ?
我有这段代码(简化):
void make()
{
std::random_device rd;
std::mt19937 generator(rd());
std::uniform_real_distribution<double> distribution(this->min, this->max);
const auto graphFunc = [this, generator, distribution](double x) -> double
{
return distribution(generator);
};
// ... use graphFunc
}
给出以下编译错误:
具有类型 'const std::mt19937' 的错误 C3848 表达式将丢失一些 const-volatile 限定符以调用 'unsigned int std::mersenne_twister<_Ty,32,624,397,31,2567483615,11,7,2636928640,15,4022730752,18 >::运算符 ()(void)' \microsoft visual studio 14.0\vc\include\random 316
对象rd的复制构造函数和赋值被声明为删除,从代码判断random.h
random_device(const random_device&) = delete;
random_device& operator=(const random_device&) = delete;
跟上面的代码有关系吗?- 在我看来它有,因为当generator复制到 lambda 时,它还必须调用rd被删除对象的复制构造函数
那么解决方法是什么?
这个编译错误的本质是什么?