【问题标题】:Can´t use an union element inside a nested structure as argument for scanf() to store desired value不能使用嵌套结构内的联合元素作为 scanf() 的参数来存储所需的值
【发布时间】:2020-01-31 01:41:06
【问题描述】:

我在使用带有联合元素的 scanf 作为参数时遇到问题,上级联合是嵌套结构的一部分。

#include <stdio.h>
int main()
{
    typedef union { float chair; int bed; } HABITATION;
    typedef struct { HABITATION room; int number; } HOUSE;

    scanf("%d",&HOUSE.room.bed);
}

编译器的错误信息是: “错误:在 ) >>ROOF

我做错了什么?

信息: 我目前使用 C,但我也对 C++ 中的相同操作和答案感兴趣。

【问题讨论】:

  • 原因在两种语言中都是一样的,也是一样的,为什么scanf("%d",&amp;int);无效。
  • 代码中ROOF在哪里?
  • C++ 代码看起来可能完全不同,并对unions 应用不同的规则。两者之间的比较本身就是一个很好的问题,在这里不应该是一个侧边栏。
  • 请注意,HOUSE 不是一个变量,它是一个类型,所以你不能将它的任何成员传递给scanf
  • @WeatherVane 是的,这就是问题所在。我混淆了它是一个变量,并不介意它仍然是一个数据类型。非常感谢。

标签: c++ c nested scanf unions


【解决方案1】:

我不懂 C,但在 C++ 中你的代码应该相当于:

#include <stdio.h>

union HABITATION { float chair; int bed; };
struct HOUSE { HABITATION room; int number; };

int main()
{
    scanf("%d",&HOUSE.room.bed);
}

也许现在很明显,您只定义了两种类型,但您从未在此代码中创建任何内容的实例。 HOUSE 是类型而不是实例。

在 c++ 中你会这样做

#include <iostream>

int main()
{
   HOUSE h; 
   std::cin >> h.room.bed;
}

并且可能不会使用所有大写名称。有些人将它们用于全局变量,我更倾向于完全禁止它们。名字应该为自己说话,无需大喊大叫。 House 在类中使用首字母大写并在实例中使用所有小写字母(例如house)就足够清楚了。这也是 Stroustrup 在his guideline 中所建议的。

【讨论】:

  • 是的,就是这样。我混淆了它是一个变量,并不介意它仍然是一个数据类型。 @WeatherVane 也发现了这一点。非常感谢你们两位。也非常感谢您提供额外的答案和信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
相关资源
最近更新 更多