我听说除了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) 晚上好.
我打开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++中跟随循环,其中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当我们执行第二行代码时,值也是相同的,同样在退出循环时,我们具有相同的值.第二个循环可以出错吗?
对我来说,第二个似乎更简单.
我碰巧在两年的这个问题中遇到了类似的情况:
有人说,当我们称之为的时候,问题是促使浮动加倍
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 …
在访问向量元素时,使用at和括号之间是否有任何区别[]?
我看到同样的人喜欢myvector.at()上面myvector[],是否有一些东西使它更优选,如在某些情况下更好的表现,或与其他一些语言共同?
假设我有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为了简单起见,我想使用它。
有类似的问题:检查变量是否是整数,但我看不到我的问题的答案.
我的意思是,最近我和很多人打架,所以我的朋友建议我安装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,取平方根,然后它必须是整数以满足等式.这就是我需要它的原因.