C++ 中的 a = 5、a(5)、a{5} 和 a[5] 有什么区别?

What is the difference between a = 5, a(5), a{5} and a[5] in C++?

提问人:RobertS supports Monica Cellio 提问时间:1/16/2020 更新时间:1/16/2020 访问量:673

问:

、 和 C++ 中的语句有什么区别?a = 5a(5)a{5}a[5]

我偶尔会看到它们用于任何事情,例如在 C++ 程序中为对象分配值。它们之间的区别在哪里?

C++ 语法 初始化 变量赋值 赋值运算符

评论

2赞 SparkFountain 1/16/2020
为什么你要发布一个问题,你已经有一个准备好的、很长的答案,而你恰好在同一个时刻发布这个问题?
0赞 RobertS supports Monica Cellio 1/16/2020
@SparkFountain 为可能遇到问题并想知道语法的任何人提供问答。

答:

5赞 RobertS supports Monica Cellio 1/16/2020 #1

在初始化(在声明对象的那一刻完成)和赋值的上下文中,C++中的所有这些语句之间存在主要区别;与其他陈述相比,最后一句话也是完全不同的事情。a[5]


前提:如果是某个数据类型的对象,例如,我们可以给 分配一个合适的值(根据声明的数据类型)。注意:该值可以通过有效的表达式计算,例如,行为与 相同。aintaa = 2 + 3;a = 5;


  1. a = 5;

这是 C++ 程序中使用的常见分配表单。它既可用于初始化,也可用于相应作用域中的后续赋值(在声明 之后)。如果正确声明为 类型,则此语句将 的整数值分配给变量 。aaint5inta

它可以直接由声明使用:

int a = 5;

第一次赋值(当在其声明中未初始化时):a

int a;
// some code may exist between.
a = 5;

或者在声明中进行第一次赋值或初始化后相应作用域中的其他任何位置的赋值(取决于存储类):

int a;          // declaration of `a`.
// some code may exist between.
a = 5;          // first assignment of `a` with the value of `5`.
// some code may exist between.
a = 7;          // assignment of the value of `7` to `a`.

  1. a(5);

此语句初始化值为 的变量 。它只能在声明时显式初始化时使用:inta5

int a(5);

否则,编译器很可能会抛出错误,因为它“认为”这将是一个函数。a

从技术上讲,可以是一个函数,它通常将值作为参数,但在这里造成差异的是对象声明的上下文。a(5)5int


  1. a{5};

与 2 相同。它使用值 进行初始化。它只能在声明时由初始化使用:a5

int a{5};

否则,编译器将抛出错误。


注意:初始化值(如 或)仅是 C++ 功能。不能以这种方式在 C 语言中初始化对象。int a{5};int a(5)


  1. a[5];

通过此语句,我们显然不会初始化或将 的值分配给变量 。取而代之的是,我们定义了一个数组,一个对象集群,由对象组成,它通过标识符表示为自己的实体:5a5a

int a[5]; // declaration of `a` - `a` is an array of 5 int objects.

因此,我们这里没有一个对象,也没有为它分配任何值。

此外,我们必须将数组的声明与:

int a[5];

以及后面对数组的某个对象的访问,如前例所示:inta

a[4] = 12;

在本例中,is 表示数组中的第 th 个对象,并将 的值分配给数组的第五个对象。a[4]512

方括号内的数字,这里称为索引号。请注意,索引号依次从 开始。因此,表示数组中的第一个对象,第二个对象,依此类推。如果声明了 with,则不能以这种方式使用,因为在本例中,它将表示第六个对象,该对象未在内存中分配给 .40a[0]a[1]a[5]aint a[5];a

评论

8赞 Algirdas Preidžius 1/16/2020
a = 5; // initialization of a with the value of 5.从技术上讲,这是一项任务。初始化必须是声明的一部分:。int a = 5;
0赞 RobertS supports Monica Cellio 1/16/2020
@AlgirdasPreidžius 我的目的是为了更好地理解而做出明确的区分。我会编辑它。
1赞 Algirdas Preidžius 1/16/2020
"我的目的是为了更好地理解而做出明确的区分。如果“区别”伴随着错误的陈述 - 它无助于理解。
0赞 RobertS supports Monica Cellio 1/16/2020
@AlgirdasPreidžius 对不起,我的错。