相关疑难解决方法(0)

基本C++类型何时具有未知的初始值?

基本的C++类型(例如intor)何时会有float未知的初始值?

内存分配的类型如何影响,如果有的话?宣言怎么样?如果它是什么的一员class/ struct/ union?C++ 11与C++ 03或C++ 98有什么不​​同?

我怀疑,但不知道我的知识是否完整(或者说是正确的)

c++ standards initialization built-in-types

4
推荐指数
1
解决办法
325
查看次数

为什么在C中允许以下内容?

为什么大多数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)

c python

3
推荐指数
1
解决办法
217
查看次数

包含已声明但未初始化的项目的初始化列表

当我没有初始化所有项目时,我有一个关于初始化列表的问题。

假设我有以下代码:

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会被初始化为1b会被初始化为未定义的值,c会被初始化为3吗?因为我没有严格按照我声明的顺序调用初始化列表,所以我会得到未定义的行为吗?或者这些都没有?

我问这个问题是因为我有一个包含大量数据的类,我想确保其中一些数据具有初始值,但我不需要初始化所有数据。

c++ initialization list-initialization

3
推荐指数
1
解决办法
1792
查看次数

默认和零初始化

#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)

c++

3
推荐指数
1
解决办法
113
查看次数

是否将本地范围的变量初始化为未确定的值或未初始化?

迂腐地说,是否x在以下代码中初始化?

int main()
{
    int x;
}
Run Code Online (Sandbox Code Playgroud)

8.5 Initializers [dcl.init](对于C++ 11)中有一些关于它的段落,但没有任何示例支持.

c++ language-lawyer

2
推荐指数
1
解决办法
97
查看次数

变量和常量同名

我有一个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'常量'.

c c++

2
推荐指数
1
解决办法
156
查看次数

不同的clang和gcc行为与指针

例如,我们有以下简单代码:

#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为我们提供了一个真实的地址,可以在没有"分段错误"的情况下访问它.

我有两个问题:

  1. 根据C标准(和C++)的正常行为是什么?
  2. 为什么会这样?

c c++ gcc clang

0
推荐指数
1
解决办法
132
查看次数

在C++中,是访问未初始化的数组未指定的行为还是未定义的行为?

例如,在以下代码中:

int myarray[3];
int x = myarray[1];
Run Code Online (Sandbox Code Playgroud)

代码是否保证在恒定时间内成功执行,x具有一些整数值?或者编译器是否可以跳过为这个完全/发出代码发出代码来启动GNU Chess并仍然符合C++标准?

这在类似于数组的数据结构中很有用,但可以在恒定时间内初始化.(对不起,我没有Aho,Hopcroft和Ullman的副本,所以不能查找名字.)

c++ unspecified-behavior

0
推荐指数
1
解决办法
181
查看次数

C++ 17编译器不应该发现未定义值的传递引用吗?

在为项目制作一个小解析器时,我不断收到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)

c++ gcc compilation clang pass-by-reference

0
推荐指数
1
解决办法
91
查看次数

对未初始化变量的任何保证?

有许多声称使用未初始化的变量会调用未定义的行为(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)

c undefined-behavior

-1
推荐指数
2
解决办法
959
查看次数

当我在c/cpp中执行int*p = p时会发生什么?

下面的代码是在MinGw中编译的.它是如何编译的?如何分配尚未创建的变量?

 int main()
{
    int*p=p;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers

-1
推荐指数
1
解决办法
93
查看次数

增加未初始化的变量合法吗?

int main() {
 int i;
 i++; // 1
}
Run Code Online (Sandbox Code Playgroud)

我可以确定使用增量后总是得到值“ 1”吗?因为我经常听到变量在初始化之前可以包含任何内容。那是非法的吗?还是如果变量未初始化,增量总是从“ 0”开始?

c++

-3
推荐指数
2
解决办法
542
查看次数