草庐IT

c++ - 对大枚举值的表示是否有任何保证?

假设我有(在32位机器上)enumfoo{val1=0x7FFFFFFF,//originally'2^31-1'val2,val3=0xFFFFFFFF,//originally'2^32-1'val4,val5};val2、val4和val5的值是多少?我知道我可以测试它,但结果是否标准化? 最佳答案 在C标准中:C11(n1570),§6.7.2.2EnumerationspecifiersEachenumeratedtypeshallbecompatiblewithchar,asignedintegertype,oranun

c++ - STL 迭代器是否保证集合更改后的有效性?

假设我有某种集合,并且我在它的开头获得了一个迭代器。现在假设我修改了集合。无论集合或迭代器的类型如何,我仍然可以安全地使用迭代器吗?为避免混淆,以下是我所说的操作顺序:获取集合的迭代器。修改集合(显然不是其中的元素,而是集合本身)。使用第1步得到的迭代器,按照STL标准还有效吗?! 最佳答案 取决于容器。例如如果是vector,修改容器后所有的迭代器都会失效。但是,如果是list,则与修改的地方无关的迭代器将保持有效。Avector'siteratorsareinvalidatedwhenitsmemoryisreallocated

c++ - STL 迭代器是否保证集合更改后的有效性?

假设我有某种集合,并且我在它的开头获得了一个迭代器。现在假设我修改了集合。无论集合或迭代器的类型如何,我仍然可以安全地使用迭代器吗?为避免混淆,以下是我所说的操作顺序:获取集合的迭代器。修改集合(显然不是其中的元素,而是集合本身)。使用第1步得到的迭代器,按照STL标准还有效吗?! 最佳答案 取决于容器。例如如果是vector,修改容器后所有的迭代器都会失效。但是,如果是list,则与修改的地方无关的迭代器将保持有效。Avector'siteratorsareinvalidatedwhenitsmemoryisreallocated

c++ - 当通过 C/C++ 中的 double 传输时,是否保证保留 float ?

假设IEEE-754一致性,当通过double传输时,float是否保证被保留?换句话说,是否总是满足以下断言?intmain(){floatf=some_random_float();assert(f==(float)(double)f);}假设f可以获取IEEE定义的任何特殊值,例如NaN和Infinity。根据IEEE的说法,是否存在这样的情况:assert会被满足,但在通过double传输后没有保留确切的位级表示?代码片段在C和C++中均有效。 最佳答案 您甚至不需要假设IEEE。C89在3.1.2.5中说:Thesetof

c++ - 当通过 C/C++ 中的 double 传输时,是否保证保留 float ?

假设IEEE-754一致性,当通过double传输时,float是否保证被保留?换句话说,是否总是满足以下断言?intmain(){floatf=some_random_float();assert(f==(float)(double)f);}假设f可以获取IEEE定义的任何特殊值,例如NaN和Infinity。根据IEEE的说法,是否存在这样的情况:assert会被满足,但在通过double传输后没有保留确切的位级表示?代码片段在C和C++中均有效。 最佳答案 您甚至不需要假设IEEE。C89在3.1.2.5中说:Thesetof

c++ - std::cout 是否保证被初始化?

我对C++的了解是,不应假定全局实例的构造(和销毁)顺序。当我使用在构造函数和析构函数中使用std::cout的全局实例编写代码时,我遇到了一个问题。std::cout也是iostream的全局实例。std::cout是否保证在任何其他全局实例之前被初始化?我写了一个简单的测试代码,它运行良好,但我仍然不知道为什么。#includestructtest{test(){std::cout打印出来test::ctorHelloworldtest::dtor有没有可能代码没有按预期运行? 最佳答案 答案会有所不同,具体取决于您使用的是C+

c++ - std::cout 是否保证被初始化?

我对C++的了解是,不应假定全局实例的构造(和销毁)顺序。当我使用在构造函数和析构函数中使用std::cout的全局实例编写代码时,我遇到了一个问题。std::cout也是iostream的全局实例。std::cout是否保证在任何其他全局实例之前被初始化?我写了一个简单的测试代码,它运行良好,但我仍然不知道为什么。#includestructtest{test(){std::cout打印出来test::ctorHelloworldtest::dtor有没有可能代码没有按预期运行? 最佳答案 答案会有所不同,具体取决于您使用的是C+

c++ - 在 std::floor 之后转换为 int 可以保证正确的结果吗?

我想要一个具有语法的floor函数intfloor(doublex);但是std::floor返回一个double。是static_cast(std::floor(x));保证给我正确的整数,或者我可以有一个非一的问题?它似乎有效,但我想确定一下。对于奖励积分,为什么std::floor首先返回一个double? 最佳答案 double的范围远大于32位或64位整数的范围,这就是std::floor返回double的原因。转换为int应该没问题,只要它在适当的范围内-但请注意double不能准确表示所有64位整数,因此您也可以结束当

c++ - 在 std::floor 之后转换为 int 可以保证正确的结果吗?

我想要一个具有语法的floor函数intfloor(doublex);但是std::floor返回一个double。是static_cast(std::floor(x));保证给我正确的整数,或者我可以有一个非一的问题?它似乎有效,但我想确定一下。对于奖励积分,为什么std::floor首先返回一个double? 最佳答案 double的范围远大于32位或64位整数的范围,这就是std::floor返回double的原因。转换为int应该没问题,只要它在适当的范围内-但请注意double不能准确表示所有64位整数,因此您也可以结束当

c++ - 将int的所有字节都设置为(unsigned char)0,保证代表零?

Thisisnotamatterofrecommendedpractise(norundefinedbehavior),butaboutwhatthec++-standardactuallyguaranteesinthematterofturningallbytesofanintegertypetothevalueof(unsignedchar)0.问题在下面的片段中,if-statement使用的表达式保证在c++11中被评估为true?std::memset(reinterpret_cast(&a),//inta;(unsignedchar)0,sizeof(int));if(a=