为什么我们不能使用 scanf 直接初始化结构中的变量?

Why can't we directly initialise a variable in struct using scanf?

本文关键字:结构 初始化 变量 不能 我们 scanf 为什么      更新时间:2023-10-16

我没有用数值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!)。