为什么此代码打印6而不是5

Why does this code print 6 instead of 5?

本文关键字:代码 打印 为什么      更新时间:2023-10-16

我不知道这个问题对您有多奇怪:为什么此代码打印6而不是5?据我所知,应该在这里使用通常的算术,因为一旦我还没有超负荷+操作员和2+3 = 3+2 = 5(我知道)

#include <stdio.h>
#include <stdlib.h>
enum A
{
    A_A,
    A_B
};
struct Foo
{
    Foo(int, int, enum A);
    int x;
    int y;
    enum A flags;
};
struct Baa : Foo
{
    Baa(int, int);
    void show();
};

Foo::Foo(int a, int b, enum A aflags)
{
    x = a;
    y = b;
    flags = aflags;
}
Baa::Baa(int c, int d)
    : Foo(c, d, A_B)
{
}
void Baa::show()
{
    if(flags == A_A)
        printf("a = [%d]n", x + y);
    else if(flags == A_B)
        printf("b = [%d]n", y + y);
    else
        puts("unknow flag");
}
int main()
{
    Baa *b = new Baa(2, 3);
    b->show();
}

输出:

b = [6]

我在访问派生类的成员值时遇到了另一个问题 - 如果您想知道,我获得了0而不是实际值,因此要获得将其施放为类型类的实际值,例如 int x = ((BaseCLass*)this)->n且奏效。因此,我开始写一个简短的代码版本以在OS上发布并寻求帮助,但现在我发现了这个问题。我想念什么?

printf("b = [%d]n", y + y);

您不是说是x+y而不是y+y吗?因此,3 3是正确的。

您正在用:

创建Baa对象
Baa *b = new Baa(2, 3);

接下来发生的事情是:

Baa::Baa(int c, int d)
    : Foo(c, d, A_B)  // < flag A_B !
{
}

,它的作用是:

Foo::Foo(int a, int b, enum A aflags)
{
    x = a;
    y = b;
    flags = aflags;
}

然后在show方法中您要做:

else if(flags == A_B)
        printf("b = [%d]n", y + y);

和y y = 3 3 = 6。混淆在哪里?


旁注: delete b;

在哪里

在我看来,关键行是:

else if(flags == A_B)
    printf("b = [%d]n", y + y);

Baa构造函数将flags设置为A_B。因此,show()将输出y + y,即3 3 = 6。