关于位域声称位域是不可移植的各种问题我都遇到过很多评论,但是我从来没有能够找到解释其原因的来源.
从表面上看,我会假设所有的位域只是编译成相同的位移代码的变化,但显然必须有更多的,或者不会有这样的激烈不喜欢它们.
所以我的问题是什么使bitfields不可移植?
Random ran = new Random();
byte tmp = (byte)ran.Next(10);
Run Code Online (Sandbox Code Playgroud)
这个代码有替代品吗?它似乎没有完全随机的行为.
所以我搜索了这个主题,发现没有什么真正相关的.
我试着看看这个简单代码背后的程序集:
int main(int argc, char *argv[])
{
double d = 1.0;
float f = static_cast<float>(d);
system("PAUSE");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是(使用Visual Studio 2012):
15: double d = 1.0;
000000013FD7C16D movsd xmm0,mmword ptr [__real@3ff0000000000000 (013FD91AB0h)]
000000013FD7C175 movsd mmword ptr [d],xmm0
16: float f = static_cast<float>(d);
000000013FD7C17B cvtsd2ss xmm0,mmword ptr [d]
000000013FD7C181 movss dword ptr [f],xmm0
Run Code Online (Sandbox Code Playgroud)
我对组装不太满意,但无论如何都试图分析它.所以前两行似乎将双精度值移动3ff0000000000000到寄存器中,然后将寄存器的内容移动到d的内存地址.
然后,我只是不确切知道下一行是什么.该cvtsd2ss操作显然是一个将双精度浮点值转换为单精度浮点值的指令,但我无法找到该指令实际执行的操作.(然后将转换后的值移动到f)的存储空间.
所以我的问题是,这个转换实际上是如何完成的?我知道C++演员会在另一种类型中产生最接近的值,但除此之外,我不知道所执行的实际操作......
当我读到有关复制构造函数和复制赋值构造函数的内容时,我理解的是两者都将它们的属性相互给出,并且它们都是由编译器隐式声明的(如果没有定义).因此,无论是否有用,都必须存在.
然后我测试了这段代码:
#include <iostream>
using namespace std;
class Test {
public:
Test () {
cout << "Default constructor" << endl;
}
Test (const Test& empty) {
cout << "Copy constructor" << endl;
}
Test& operator=(const Test& empty) {
cout << "Copy assignment operator" << endl;
}
private:
};
int main () {
Test a; // Test default constructor
Test b (a); // Test copy constructor
Test c = b; // Test copy assignment constructor
system ("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但似乎根本没有调用复制赋值运算符.我尝试了三个条件: …
我正在尝试使用非常旧的格式读取一种文件.
在其中,日期格式以yymmdd格式指定,其中[00,59]范围内的2位数年份被认为是21世纪,而[60,99]范围内的年份被认为是在20世纪,59代表2059年,60代表1960年.
我如何将其解析为DateTimeC#?
我试过做:
string str = ReadDateFromFile();
DateTime dt;
DateTime.TryParseExact(str, "yyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
Run Code Online (Sandbox Code Playgroud)
但是,默认的2位数年份规则将[00,29]范围内的值视为21世纪,将值[30,99]视为20世纪.
有没有办法修改这种行为来做我想要的或者是否有我可以使用的不同技术?
在Java中,您可以这样做:
long now = (new Date()).getTime();
Run Code Online (Sandbox Code Playgroud)
我怎么能用c ++做同样的事情?
当你调用Close一个活动StreamWriter时,它就不可能再向流写入代码了(因为它已被关闭).要打开另一个流,您必须创建一个新的实例,StreamWriter因为没有'Open'方法.
我的问题是,什么是在具有点Close和Dispose当你真的不能使用任何东西,除了Dispose关闭流后?
我能理解是否有一个Open函数,即你可以关闭一个文件然后使用相同的文件打开另一个文件StreamWriter.但是因为Close除了Dispose之后你还不能真正使用任何东西,为什么不放弃Close并Dispose关闭底层流作为它的第一个动作呢?
我收到Dispose来自IDisposeable和所有.我想知道的是,为什么Close在Dispose看起来Close无论如何都要特别需要.
据我所知,如果没有打开另一个流的能力StreamWriter,没有任何意义,因为所有其他方法都变得无用Close,Dispose之后你别无选择.
为什么是,StreamWriter有什么麻烦事Close时,他们可以合并Close和Dispose成一个单一的方法?
math.h去提供min和max但不是钳位功能的麻烦.我本以为,因为它们通常都是类似的实现方式,所以它们都会出现在同一个库中.
是否有任何特殊原因math.h没有钳位功能|宏?难道创造者math.h认为没有必要,或者他们只是不考虑它?
编辑:似乎人们忽略了这一点.我不是在问为什么他们不加钳,因为我很懒,不喜欢写一个新夹子 - 恰恰相反,我几乎没有使用它(虽然我承认我使用它比使用一些标准更多库).
我要问的是"有没有人知道为什么c ++标准化机构或创作者或任何选择不包含钳位功能的人math.h?".
我绝不抱怨它不在math.h,我只是在问"它有没有充分的理由不存在?".
编辑:我明确 没有问如何编写clamp()函数.
cppreference指出:
在对象声明或非静态成员函数中使用的constexpr说明符(直到C++ 14)暗示const.
"对象声明"是否意味着"任何变量声明"?
即
constexpr const int someConstant = 3;
Run Code Online (Sandbox Code Playgroud)
相当于
constexpr int someConstant = 3;
Run Code Online (Sandbox Code Playgroud)
在C++ 11,C++ 14和C++ 17中?
我最近遇到了一些C++代码,如下所示:
if(test_1)
if(test_2)
{
// Do stuff
}
else
exit(0);
Run Code Online (Sandbox Code Playgroud)
这是不明确的,因为编译器可以将其视为:
if(test_1)
{
if(test_2)
{
}
else
{
}
}
Run Code Online (Sandbox Code Playgroud)
或作为:
if(test_1)
{
if(test_2)
{
}
}
else
{
}
Run Code Online (Sandbox Code Playgroud)
是否根据任何标准(C,C++)定义了此代码的行为?我在VC++的C++程序中看到了这段代码,它似乎更喜欢第一个解决方案.
c++ ×7
.net ×2
c# ×2
assembly ×1
bit-fields ×1
c ×1
c#-4.0 ×1
com ×1
constexpr ×1
datetime ×1
equivalent ×1
portability ×1
std ×1
time ×1
vb.net ×1
visual-c++ ×1