基本的C++类型(例如intor)何时会有float未知的初始值?
内存分配的类型如何影响,如果有的话?宣言怎么样?如果它是什么的一员class/ struct/ union?C++ 11与C++ 03或C++ 98有什么不同?
我怀疑,但不知道我的知识是否完整(或者说是正确的)
为什么大多数C的实现都允许以下行为?如果我们使用变量本身来定义它,就像这样:
#include <stdio.h>
int main()
{
int a = 9;
int b = ( a +b );
printf("%d",b);
}
Run Code Online (Sandbox Code Playgroud)
我知道将使用垃圾值,b但应该有一些编译时警告.这对我来说听起来有点奇怪.在像Python这样的语言中,执行这样的操作是违法的:
>>> b = 9
>>> a = a + b
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
a = a + b
NameError: name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)
我想Python不会将变量放到当前的命名空间,直到它定义良好(即它在当前范围内有一个值),而在C中,上面的语句断开如下:
int b = 9;
int a; // put to namespace or whatever a lookup table with garbage value
a = a …Run Code Online (Sandbox Code Playgroud) 当我没有初始化所有项目时,我有一个关于初始化列表的问题。
假设我有以下代码:
class Example {
int a, b, c;
Example() : a(1), b(2), c(3) {}
}
Run Code Online (Sandbox Code Playgroud)
我知道成员初始化的顺序是由它们的声明顺序定义的,而不是由它们在初始化列表中列出的顺序定义的,但是,如果我在初始化列表中没有b,就像在下列的?
class Example {
int a, b, c;
Example() : a(1), c(2) {}
}
Run Code Online (Sandbox Code Playgroud)
a会被初始化为1,b会被初始化为未定义的值,c会被初始化为3吗?因为我没有严格按照我声明的顺序调用初始化列表,所以我会得到未定义的行为吗?或者这些都没有?
我问这个问题是因为我有一个包含大量数据的类,我想确保其中一些数据具有初始值,但我不需要初始化所有数据。
#include <string>
struct T1 { int mem; };
struct T2
{
int mem;
T2() { } // "mem" is not in the initializer list
};
int n; // static non-class, a two-phase initialization is done:
// 1) zero initialization initializes n to zero
// 2) default initialization does nothing, leaving n being zero
int main()
{
int n; // non-class, the value is indeterminate
std::string s; // class, calls default ctor, the value is "" (empty string)
std::string a[2]; // …Run Code Online (Sandbox Code Playgroud) 迂腐地说,是否x在以下代码中初始化?
int main()
{
int x;
}
Run Code Online (Sandbox Code Playgroud)
在8.5 Initializers [dcl.init](对于C++ 11)中有一些关于它的段落,但没有任何示例支持.
我有一个C代码片段如下:
const int x = 5;
void main()
{
int x[x];
int y = sizeof(x) / sizeof(int);
printf("%d",y);
}
Run Code Online (Sandbox Code Playgroud)
代码片段将被编译并正确运行.但我不明白如何区分x'变量'和x'常量'.
例如,我们有以下简单代码:
#include "stdio.h"
int main() {
int* pointer_to_check;
printf("%x\n", pointer_to_check);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc,我们将在输出时得到零(对我而言,正常行为,因为指针与内存无关),但是clang为我们提供了一个真实的地址,可以在没有"分段错误"的情况下访问它.
我有两个问题:
例如,在以下代码中:
int myarray[3];
int x = myarray[1];
Run Code Online (Sandbox Code Playgroud)
代码是否保证在恒定时间内成功执行,x具有一些整数值?或者编译器是否可以跳过为这个完全/发出代码发出代码来启动GNU Chess并仍然符合C++标准?
这在类似于数组的数据结构中很有用,但可以在恒定时间内初始化.(对不起,我没有Aho,Hopcroft和Ullman的副本,所以不能查找名字.)
在为项目制作一个小解析器时,我不断收到Segmentation Faults ...跟踪它转换为转置错误.
此代码示例不是原始代码,但会重现故障.
我很惊讶我的编译器都没有发现引用是未初始化的.
GCC和Clang似乎都在没有警告或错误的情况下编译它.
难道他们不应该将v2 的参考标记为未初始化吗?
我对C++比较陌生,正在学习C++ 17/20.但我很好奇为什么,在这种情况下,编译器没有发现v2未定义但无论如何都将引用传递给未定义的对象.
#include <iostream>
#include <vector>
struct A
{
using vectorA = std::vector<A>;
int foo;
vectorA vA;
A() = delete; // Implicit but let's be certain!
A(int f) noexcept
: foo {f},
vA {}
{}
};
A::vectorA& recurse(A::vectorA& head, int tail) noexcept
{head.emplace_back(tail); return head;}
int main()
{
// A tree of A's
A::vectorA v1 {};
// Fill it using recursive fn converting bars into foos,
// a bar at …Run Code Online (Sandbox Code Playgroud) 有许多声称使用未初始化的变量会调用未定义的行为(UB).
仔细阅读文档,我无法验证该声明,因此我想要一个令人信服的论据,为C和C++澄清这一点.
我期望两者都有相同的语义,但我准备对微妙或不那么微妙的差异感到惊讶.
使用未初始化变量开始的一些示例.请根据需要添加其他人,以解释他们未涵盖的任何角落案例.
void test1() {
int x;
printf("%d", x);
}
void test2() {
int x;
for(int i = 0; i < CHAR_BIT * sizeof x)
x = x << 1;
printf("%d", x);
}
void test3() {
unsigned x;
printf("%u", x); /* was format "%d" */
}
void test4() {
unsigned x;
for(int i = 0; i < CHAR_BIT * sizeof x)
x = x << 1;
printf("%u", x); /* was format "%d" */
}
Run Code Online (Sandbox Code Playgroud) 下面的代码是在MinGw中编译的.它是如何编译的?如何分配尚未创建的变量?
int main()
{
int*p=p;
return 0;
}
Run Code Online (Sandbox Code Playgroud) int main() {
int i;
i++; // 1
}
Run Code Online (Sandbox Code Playgroud)
我可以确定使用增量后总是得到值“ 1”吗?因为我经常听到变量在初始化之前可以包含任何内容。那是非法的吗?还是如果变量未初始化,增量总是从“ 0”开始?