无法在变量c ++的初始化中包含多个表达式

Posted

技术标签:

【中文标题】无法在变量c ++的初始化中包含多个表达式【英文标题】:unable to include multiple expressions in initialization of a variable c++ 【发布时间】:2021-10-18 18:17:41 【问题描述】:

在cppreference.com网站上有说明,类似的东西

对于每个声明器,初始化器可能是以下之一:

( 表达式列表 ) (1)

= 表达式 (2)

初始化列表 (3)

    任意表达式的逗号分隔列表和括号中的花括号初始化列表

但在我的代码中

int main()

    int a,b=5,c(a,b);
    return 0;

当我尝试编译时,出现以下错误

...错误:表达式列表在初始化程序 [-fpermissive] 中被视为复合表达式

我的问题是,如果在这种初始化风格中允许多个表达式列表,那么为什么编译器不接受变量c? 我错过了什么?

【问题讨论】:

你希望c(a,b) 做什么? 只是测试我对该概念的了解(包括变量初始化中的逗号分隔列表),预计没问题,但正在生成编译时错误。 您是否希望c 的类型为int?你如何期望c(a,b) 初始化一个int a,b 不能是表达式列表(因为 int 没有构造函数)。这是一个引起歧义的地方的逗号表达式,有效的初始化程序是c((a,b)) 我认为这里的答案将是“有效语法不保证可以编译的代码 【参考方案1】:

好吧,让我们看看这个:

int main()

    int a,b=5,c(a,b);
    return 0;

您希望 c(a,b) 实际做什么?

让我们稍微简化一下:

int main()

    int a,b=5;
    int c(a,b);
    return 0;

这将产生相同的语法错误,但它现在是独立的。所以...

如果有一个将两个整数作为参数的 int 构造函数,您的代码就可以工作。这也可以编译:

int c(int a, int b);

但在这种情况下,您实际上是在定义一个函数。

另外,这可行:

int main() 
    int a = 5;
    int b = 10;
    int c(b);

    std::cout << "C == " << c << std::endl;

之所以有效,是因为可以从单个 int 初始化 int。但是你得到一个错误,因为你不能从其他两个 int 初始化一个 int。

这行得通:

#include <iostream>

class MyClass 
public:
    MyClass(int a, int b): value(a + b) 
    int value;
;

int main() 
    int a = 5;
    int b = 10;
    MyClass c(a, b);

    std::cout << "C == " << c.value << std::endl;

也许这就是您阅读的文章试图告诉您的。注意:cpppreference 不是学习 C++ 的好站点。买一本好书。

【讨论】:

请给我推荐一本好书,通过阅读,我不需要从任何其他来源查阅,它彻底解释了我的概念,引导我从初学者到高级,请告诉我为什么那个网站不适合学习 c++? cpppreference 是一个参考站点。它试图成为一个教程网站,但我不认为它做得很好,尤其是对于初学者。其他人可能不同意我的观点。至于好的 C++ 书籍——我使用的那些都是 90 年代的,而且已经过时了。但是,如果您在 Google 上搜索“优秀的 C++ 书籍”,您会得到很多提供建议的人。 它没有试图成为一个教程网站。它的目标受众是熟练工,而不是学徒。

以上是关于无法在变量c ++的初始化中包含多个表达式的主要内容,如果未能解决你的问题,请参考以下文章

在返回语句中包含多个变量[重复]

在多个 Makefile 中包含 Makefile 和 Echo 变量

在 Bash 中包含多个带引号的 args 的变量

C 位域

Wordpress:在 url 中包含语言变量

如何在一个窗口中包含多个图表[重复]