标签: initialization

当用“or”和“?”比较两个值时,C++ 中的奇怪行为 操作员

我在一个旧的桌面应用程序中有一些代码,这是我从一位离开公司的同事那里继承的。这是我实际代码的一个简短的类似示例:

#include <iostream>
int getType(int type)
{
    return type;
}

int main()
{
    int variable1 = 30;
    int variable2 = 40;
    int result = (getType(30) == (variable1 || variable2) ? 1 : 2);
    std::cout << result << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

对于结果,我总是收到 2,而不是我预期的 1。如果我尝试:

int result = (getType(30) == (variable1) ? 1 : 2)

结果是真的。

我不明白为什么这部分:

int result = (getType(30) == (variable1 || variable2) ? 1 : 2)

不是真的……

c++ initialization conditional-operator comparison-operators logical-or

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

C++数组初始化

为什么我不能用字符串初始化本地数组

c++ arrays initialization

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

使用array或alloc init初始化NSMutableArray

我是Obejtive C的新手,所以当时我正在查看很多示例代码,我注意到人们初始化他们的NSMutableArray的方式不同.

NSMutableArray *items = [NSMutableArray array];
Run Code Online (Sandbox Code Playgroud)

要么

NSMutableArray *items = [[NSMutableArray alloc] init];
Run Code Online (Sandbox Code Playgroud)

在这两行中,您最终得到一个NSMutableArray对象.
它们之间有什么区别或它们完全相同?

initialization objective-c nsmutablearray

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

指针给出了意想不到的价值

void first(){
    int x;
    int *p;
    p= &x;
    scanf("%d",p);
    printf("The value in x or *p is: %d\n",x);
}


void second(){
    int x;
    int *ptr;
    scanf("%d",&x);
    printf("The value in *ptr is: %d\n",*ptr);
}


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

在上面的代码中,second()函数是miss行为.我为x赋值的变量*ptr以及x 赋予了什么值.为什么?

c pointers initialization undefined-behavior

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

C中生成的变量的垃圾值如何?

我的意思是问它是否遵循一些特定的算法,实际上不是垃圾.

换句话说,"垃圾"值究竟是如何存在的?考虑不调用UB,如果读取垃圾值,该值的来源是什么?

c variables initialization undefined-behavior

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

C++如何使用隐藏的默认构造函数初始化成员?

我有一个隐藏默认构造函数的类,强制使用带参数的构造函数.另一个类使用该类的2个实例:

typedef struct { ... } BAZ;

class Foo {
  private:
    Foo(void) {}

  public:
    Foo(BAZ a) { ... }
};

class Bar {
  private:
    Foo foo1;
    Foo foo2;

    Bar(void) {}

  public:
    Bar(BAZ a, BAZ b) : foo1(a), foo2(b) { ... }
};
Run Code Online (Sandbox Code Playgroud)

最明显的是变量foo1和foo2的声明将调用默认的Foo构造函数,但由于它是私有的,它不能并且会给编译器错误.

有没有办法阻止它尝试默认的Foo构造函数,只是等待Bar构造函数初始化它们?

我想避免使用new关键字(这将解决整个问题).

编辑:
似乎人们很难理解问题和困境.我会试着解释一下:

我想强制使用Foo(BAZ)构造函数,这意味着任何使用Foo(void)构造函数的尝试都会产生错误.

要隐藏默认构造函数,它将被声明为私有成员.如果有人试图使用默认构造函数Foo(),它将给出故意错误.

要不声明默认构造函数,只声明Foo(BAZ)不会阻止编译器创建公共默认构造函数.如果我将其声明为Foo(),则不会出错.到目前为止它的工作正常并且符合预期.

第二类Bar有两个Foo实例,但是当实例化Bar时,这些Foo成员将使用默认(隐藏)构造函数调用并生成错误.然后在Bar构造函数中,这两个实例将使用正确的公共构造函数Bar(BAZ a,BAZ b)初始化:foo1(a),foo2(b).这就是我要的.

有没有办法防止它在初始化Bar时调用Foo默认构造函数,所以Bar构造函数可以使用正确的Foo构造函数?

解决方案的工作,因为默认的构造函数永远不会被调用:

BAZ a = {...}
Foo *foo1 = new Foo(a);
Run Code Online (Sandbox Code Playgroud)

我希望这更清楚.

EDIT2:已解决 错误不在隐藏的Foo构造函数中,它是隐藏的Bar构造函数,试图使用隐藏的默认Foo构造函数.

Bar(void) : Foo(BAZ{}), Foo(BAZ{}) {}
Run Code Online (Sandbox Code Playgroud)

解决了它.

编辑3:
真正的问题似乎是在开发工具中.重新启动并手动清除缓存后,它就像C++ 14标准一样工作.

c++ constructor initialization atmelstudio c++14

-4
推荐指数
2
解决办法
572
查看次数

C中未初始化指针的值

假设我们在C中具有以下声明:

double d[25], * p;
int * t;
char * c;
Run Code Online (Sandbox Code Playgroud)

我们如何解释以下printf()结果?

printf("d : %x\t",d);
printf("p : %x\t",p);
printf("t : %x\t",t);
printf("c : %x\t",c);
Run Code Online (Sandbox Code Playgroud)

哪个打印ligne:

d : 62fd30    p : 1    t : 0    c : 39    
Run Code Online (Sandbox Code Playgroud)

我们可以很清楚地看到d的内存地址,但p,t和c看起来都不像地址。我曾经认为,未初始化的指针在声明后采用Null值。我错了吗?我们如何解释这些结果?

c pointers initialization

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

在C语言中,变量的多次初始化不会引发错误。为什么?

在下面的代码中,变量被多次初始化。

为什么此代码不引发错误?

int main() 
{ 
  int x;
  x=5;
  x=10;
  printf("\nx=%d",x) ;
}
Run Code Online (Sandbox Code Playgroud)

节目输出

x = 10

c initialization

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

C语言是否仅为void指针指定任何隐式初始化?

这是我的代码:

int main()
{
    int *p;
    void *x;
    printf("%p\n", p);
    printf("%p\n", x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

将打印:

koraytugay $ ./a.out
0x7fff53b35ad0
0x0
koraytugay $ ./a.out
0x7fff5803fad0
0x0
koraytugay $ ./a.out
0x7fff512c9ad0
0x0
koraytugay $ ./a.out
0x7fff55213ad0
0x0
koraytugay $ ./a.out
0x7fff52dbdad0
0x0

这种行为在语言中有什么解释吗?

c initialization void-pointers

-5
推荐指数
2
解决办法
84
查看次数

这些C++代码有什么区别?

我正在尝试这个构造函数代码,并对它的工作方式感到困惑.

#include<iostream>
using namespace std;
class XYZ{
    int a,b;
    public:
        XYZ(int i, int j):a(i), b(a*j){}
        void show(){
            cout<<a<<"\t"<<b<<"\n";
        }
};
int main(){
    XYZ X(2,3);
    X.show();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给出了预期的结果,但是,

#include<iostream>
using namespace std;
class XYZ{
    int b,a;
    public:
        XYZ(int i, int j):a(i), b(a*j){}
        void show(){
            cout<<a<<"\t"<<b<<"\n";
        }
};
int main(){
    XYZ X(2,3);
    X.show();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

出乎意料的结果.

唯一的区别是int a,bint b,a

以及如何XYZ(int i, int j):a(i), b(a*j){}正常工作?

c++ constructor initialization

-5
推荐指数
2
解决办法
69
查看次数