我不确定在初始化后以下列方式在char数组中会出现什么:
char buf[5]={0,};
Run Code Online (Sandbox Code Playgroud)
这相当于
char buf[5]={0,0,0,0,0};
Run Code Online (Sandbox Code Playgroud) 我有一个公开面向结构A和内部结构B的API,需要能够将结构B转换为结构A.以下代码在C99(和VS 2010/C89)和C中是合法且定义良好的行为 ++ 03/C++ 11?如果是,请解释是什么使它明确定义.如果不是,那么在两种结构之间进行转换的最有效和跨平台的方法是什么?
struct A {
uint32_t x;
uint32_t y;
uint32_t z;
};
struct B {
uint32_t x;
uint32_t y;
uint32_t z;
uint64_t c;
};
union U {
struct A a;
struct B b;
};
int main(int argc, char* argv[]) {
U u;
u.b.x = 1;
u.b.y = 2;
u.b.z = 3;
u.b.c = 64;
/* Is it legal and well defined behavior when accessing the non-write member of a union in this case? */
DoSomething(u.a.x, u.a.y, …Run Code Online (Sandbox Code Playgroud) 可能重复:
我在哪里可以找到当前的C或C++标准文档?
我想将STL与我正在研究的当前程序一起使用,并且供应商不支持我认为合理的STL,工作不是我的合理想法.我一直无法找到一个C++标准或STL标准,它不仅仅是一个让我想知道我的解释是否正确或供应商解释是否正确的API.我已经在SGI的网站上花了很多时间.任何推荐?此外,是否有任何文档不是API被认为是标准?
我在C中做了一些需要使用字符串的东西(就像大多数程序一样).
查看联机帮助页,我发现,在字符串(3)处:
概要
Run Code Online (Sandbox Code Playgroud)#include <strings.h> char * index(const char *s, int c) (...) #include <string.h> char * strchr(const char *s, int c)
所以我好奇地看着strchr(3)和index(3)......
我发现两者都做到了以下几点:
strchr()/ index()函数定位s指向的字符串中第一次出现的c.终止空字符被认为是字符串的一部分; 因此,如果c为'\ 0',则函数定位终止'\ 0'.
因此,该联机帮助页基本上是一个复制和粘贴.
此外,我认为,由于一些混淆的必要性,第二个参数有类型int,但实际上是一个char.我想我没有错,但任何人都可以向我解释为什么它是一个int,而不是一个char?
如果它们都是相同的,哪一个在版本之间更兼容,如果不兼容,哪个区别?
C++ 11标准ISO/IEC 14882:2011与后来的免费下载草案 N3337之间的条款,章节,小节,段落等的编号是否不同?
需要明确的是:我的问题不在于是否建议使用N3337代替官方标准,因为Stackoverflow已经很好地回答了这个问题; 但只是编号不同.
作为参考,这里是我发现的最接近相关的非Stackoverflow答案(如果你按照链接,具体参考日期为"Sun Mar 18,12:06:41 PM"的项目).另外作为参考,@ Nemo将注意力集中在相关的Stackoverflow问题上.
请考虑以下示例代码:
class C
{
public:
int* x;
};
void f()
{
C* c = static_cast<C*>(malloc(sizeof(C)));
c->x = nullptr; // <-- here
}
Run Code Online (Sandbox Code Playgroud)
如果由于任何原因我不得不忍受未初始化的内存(当然,如果可能的话,我会打电话new C()),我仍然可以调用放置构造函数.但是,如果我省略这一点,如上所述,并手动初始化每个成员变量,是否会导致未定义的行为?即绕过构造函数本身未定义的行为,或者用类外的一些等效代码替换调用它是否合法?
(通过另一个完全不同的问题遇到这个问题;要求好奇......)
事实证明,许多无辜的东西都是C++中未定义的行为.例如,一旦一个非空的指针已被delete"D 甚至在打印的是指针的值是未定义的行为.
现在内存泄漏肯定是坏事.但他们是什么类的情况 - 定义,未定义或其他类别的行为?
如果我们看看草案C++标准部分5.1.2 Lambda表达式第2段说(强调我的未来):
lambda表达式的评估导致prvalue临时(12.2).这个临时对象称为闭包对象.lambda表达式不应出现在未评估的操作数中(第5条).[注意:闭包对象的行为类似于函数对象(20.8).-结束注释]
和部分5.19 常量表达式第2段说:
条件表达式是核心常量表达式,除非它涉及以下之一作为潜在评估的子表达式(3.2),但是未评估的逻辑AND(5.14),逻辑OR(5.15)和条件(5.16)操作的子表达式不被视为 [...]
并有以下子弹:
- lambda表达式(5.1.2);
那么为什么lambda表达式不允许在未评估的操作数中,但是在常量表达式的未评估部分中是允许的?
我可以看到,对于未评估的操作数,在几种情况下(decltype或typeid)的类型信息不是很有用,因为每个lambda都有一个唯一的类型.虽然为什么我们想要让它们在未经评估的不断表达的背景下不明确,或许是为了让SFINAE?
该constexpr关键字是在C++ 11中引入的,因为(我认为)是"常量表达式"的相应概念.但是,这个概念隐含在C++ 98/c ++ 03中,因为数组声明需要一个常量表达式:
// valid:
int a[sizeof(int)];
int b[3+7];
int c[13/4];
const int n = 3;
int d[n];
// invalid:
int m = 4;
int e[m];
Run Code Online (Sandbox Code Playgroud)
还有其他"常量表达式",即可以在编译时评估(和/或必须)的表达式; 一个例子是模板参数.
对于预C++ 11,在C++ 98/03标准或其他地方是否存在以下情况?