为什么我们不能使用 scanf 直接初始化结构中的变量?
Why can't we directly initialise a variable in struct using scanf?
我没有用数值0初始化结构中的变量,而是尝试使用scanf,这样它可以直接读取我的输入值。它不起作用,但我不明白为什么?
我想知道这是否与使用&(p1.first)无效,因为内存空间尚未分配?如果是这样的话,唯一的方法是在初始化后重写scanf语句来更新我的结构变量的值吗?
#include <iostream>
using namespace std;
typedef struct {
int first;
int second;
} score;
int main() {
score p1 = {
p1.first = scanf("%d", &(p1.first)),
p1.second = 0,
};
/* I know the following works:
score p1 = {
p1.first = 0,
};
scanf("%d", &(p1.first));
*/
printf("%d", p1.first);
}
当输入为2时,我也希望得到2,但不管我尝试的输入值是多少,printf都会打印1。
scanf返回扫描的项目数。在这种情况下,您描述特定输入的方式总是1。这就是1的由来。
您可以从表达式初始化成员。表达式是对某个值求值的代码。作为函数调用的代码位计算函数调用返回的值。
scanf
不会返回所需的值,而是成功解析的参数数的计数(请阅读文档!)。这不是你想要使用的。然后,您尝试在scanf
的"out parameter"槽中命名成员,但这不起作用,因为(a)对象还不存在,(b)您实际上即将从另一个值初始化成员,因为(c)out参数对表达式的计算结果没有影响。
简而言之,这是行不通的。您可以将调用封装到一个特定的新函数中,该函数会返回您需要的内容:
#include <cstdio>
struct score {
int first;
int second;
};
int ReadANumber()
{
int number;
const int r = std::scanf("%d", &number);
if (r > 0 && r != EOF)
return number;
// some fallback, or you could throw an exception!
return -1;
}
int main() {
score p1 = { ReadANumber(), 0 };
printf("%d", p1.first);
}
(现场演示)
请注意,我还更正了您的头include,删除了初始值设定项中的赋值(奇怪;出于神秘的原因工作,但不要这样做),取消了类定义,并删除了using namespace std
,因为我们不喜欢这样
…或者坚持你在评论中的工作解决方案(尽管这排除了将p1
声明为const
!)。
相关文章:
- 多成员Constexpr结构初始化
- 为什么用结构初始化数组需要指定结构名称
- 使用指定的初始值设定项聚合匿名结构初始化
- 不同的类或结构初始化方法之间的性能差异是什么?
- 如何在结构初始化中获取成员C++
- C++正确的结构初始化
- 使用大括号进行结构初始化
- 内部结构初始化不起作用 - C++
- 使用嵌套结构初始化并集
- 使用匿名结构初始化联合
- 结构初始化语法
- 结构初始化的 C++ 向量
- C++嵌套结构初始化和访问成员
- 结构初始化中的常量正确性
- 使用 C++ 中的自定义元素进行 Const 结构初始化
- 如何在结构C++初始化内置数组
- Visual C++ 模板类成员结构初始化语法糖
- C++结构初始化
- C 在结构初始化过程中带有内部阵列的奇怪错误
- 此C/C 的结构初始化器如何使用足够的字段工作