小编Kus*_*vil的帖子

为什么〜(真的是真的)不是真的吗?布尔运算符(否定)适用于`unsigned char`s,但不适用于bools?(C++)

我听说除了0以外通常"一切"都是真的.但现在我发生了很奇怪的事情......或者我只是认为我这样做是正确的,而我却没有.这是发生了什么:

当我要检查,如果一个相当于b,我可以使用NOT(a XOR b).例如,当我检查它时unsigned char,一切都很好

unsigned char a = 5;
unsigned char b = 3;
unsigned char c = ~(a^b);
Run Code Online (Sandbox Code Playgroud)

给了我c == 249:

a是:00000101,即5.

b是:00000011,即3.

〜(a ^ b)是:11111001,即249.

现在,让我们试试吧bool.

cout << ~(true^true) << ~(true^false) << ~(false^true) << ~(false^false) << endl;
cout << ~(~(true^true)) << ~(~(true^false)) << ~(~(false^true)) << ~(~(false^false)) << endl;

if (~(true^true) == true)
    cout << "true";
else …
Run Code Online (Sandbox Code Playgroud)

c++ boolean boolean-expression boolean-operations

5
推荐指数
2
解决办法
381
查看次数

如何在c ++中修改知道内存地址的对象?

晚上好.

我打开Visual Studio 2012并运行程序执行此操作:

    double x = 8768130;
    cout << &x;

    cin.get();
    return 0;
Run Code Online (Sandbox Code Playgroud)

它在控制台中写的地址是003CFBF8.

然后,我打开了Visual Studio的另一个副本并尝试阅读此内容,但我不确定我是否正确执行此操作.在发布之前我已经在Stack Overflow中搜索并发现我应该做类似的事情:

    double* ptr = reinterpret_cast<double*>(0x003CFBF8);

    cout << *ptr;
Run Code Online (Sandbox Code Playgroud)

但它产生了例外

Unhandled exception at 0x00A943DD in Project2.exe: 0xC0000005: Access violation reading location 0x003CFBF8.

那是什么意思?我无法访问?我做错了吗?

如果你问我为什么要这样做,我正在从一些书中学习C++,我想检查一下是如何volatile工作的.这就是为什么我想:

  • 打开第一个程序,初始化变量,写出它的地址;
  • 打开第二个程序并修改与之相关的书面地址
  • 在第一个程序中写入变量以检查一切是否正常.

c++ memory-management visual-studio-2012

4
推荐指数
1
解决办法
132
查看次数

通过删除最后一个参数,简化(a; b; c)到C++中的(x; y;)

让我们考虑在C++中跟随循环,其中A是向量或其他容器使用.size():

for(int n=0; n < A.size(); ++n)
    cout << A[n];
Run Code Online (Sandbox Code Playgroud)

我认为它等同于下面的循环(至少在这种情况下,如果它不是真的完全等价,你能帮我找出原因吗?我找不到反例)

for(int n=-1; ++n < A.size(); )
    cout << A[n];
Run Code Online (Sandbox Code Playgroud)

以某种方式使用第一个循环比第二个更好吗?我看到人们到处使用第一个循环,但从未见过第二个循环.为什么没有人像第二个例子那样做?是否有一些反指示不这样做?在这两种情况下,n当我们执行第二行代码时,值也是相同的,同样在退出循环时,我们具有相同的值.第二个循环可以出错吗?

对我来说,第二个似乎更简单.

c++ loops for-loop

2
推荐指数
1
解决办法
184
查看次数

变量函数(va_arg)不适用于float,而printf有效吗?有什么区别?

我碰巧在两年的这个问题中遇到了类似的情况:

变量函数(va_arg)不适用于float?

有人说,当我们称之为的时候,问题是促使浮动加倍

    va_arg(arg, float)
Run Code Online (Sandbox Code Playgroud)

我的问题是在这篇文章的最后,但首先让我们来看看@ Jack在上面链接的问题下面的答案:

#include <stdio.h>          
#include <stdarg.h>

void foo(int n, ...)
{   
    va_list vl;
    va_start(vl, n);

    int c; 
    double val; 

    for(c = 0; c < n; c++) {
        val = va_arg(vl, double);
        printf("%f\n", val);
    }

    va_end(vl);
}


int main(void)
{
  foo(2, 3.3f, 4.4f);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

3.300000
4.400000
Run Code Online (Sandbox Code Playgroud)

现在,如果我们改变val = va_arg(vl, double)val = va_arg(vl, float),我们会得到(至少我得到了2012 MSVS):

36893488147419103000.000000
2.162500
Run Code Online (Sandbox Code Playgroud)

我们现在回答我的问题.

在这个主题:C/C++ va_list没有正确地返回参数 最多的投票答案,它的评论说,这printf促进了 float 's to …

c c++ floating-point variadic-functions

2
推荐指数
1
解决办法
1387
查看次数

访问存储在vector中的对象:使用std :: vector :: at或std :: vector :: operator []?

在访问向量元素时,使用at和括号之间是否有任何区别[]

我看到同样的人喜欢myvector.at()上面myvector[],是否有一些东西使它更优选,如在某些情况下更好的表现,或与其他一些语言共同?

c++ vector

1
推荐指数
1
解决办法
70
查看次数

使用“自动”遍历时擦除许多向量元素

假设我有vector成对,其中每个pair对应于我正在处理的某个矩阵的索引(行和列)

using namespace std;
vector<pair<int, int>> vec;
Run Code Online (Sandbox Code Playgroud)

我想使用auto遍历整个向量并立即删除满足某些条件的所有对,例如

for (auto& x : vec) {
    if (x.first == x.second) {
        vec.erase(x); 
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为我想vec.erase()应该有一个迭代器作为参数,x实际上pair是一个 vector 元素vec,而不是迭代器。我尝试以几种方式对其进行修改,但我不确定如何auto准确地处理容器元素以及如何解决此问题。

我可以轻松修改上面的代码以使其工作并擦除 vector 的多个元素,同时使用auto? 或者我应该修改我的方法?

现在它只是一个成对的向量,但以后会更糟,所以auto为了简单起见,我想使用它。

c++ vector erase auto

1
推荐指数
1
解决办法
63
查看次数

如何检查数字是否为整数,具有良好的精度?

有类似的问题:检查变量是否是整数,但我看不到我的问题的答案.

我的意思是,最近我和很多人打架,所以我的朋友建议我安装Python.我今天打开它,这样我就可以计算大数字并且具有良好的精度,但是...如何使用这种精度?我的意思是,如果我做了类似的pow(31,123)工作,但如果我想检查数字是否为整数,我得到:

>>> (4.00000000000001).is_integer()
False
>>> (4.000000000000001).is_integer()
False
>>> (4.0000000000000001).is_integer()
True
>>> (4.00000000000000001).is_integer()
True
Run Code Online (Sandbox Code Playgroud)

我想写一个简单的循环来找到一些丢番图方程的解,我需要从非常大的数字取平方根并检查它是否是整数,但现在我处于紧张状态.有人可以帮助我或者给我一个如何获得更好精度的建议吗?

例:

例如:$ 2x ^ 2 = 1 + y ^ 31 $,其中x,y是整数.我的想法是循环,我增加y(从1开始),加1,除以2,取平方根,然后它必须是整数以满足等式.这就是我需要它的原因.

python integer diophantine

0
推荐指数
1
解决办法
1120
查看次数