字面值和运算符是像C++这样的编程语言中的基本元素。它们在代码中表达和操作数据起着至关重要的作用。在本简介中,我们将探讨字面值和运算符是什么,以及它们在C++中如何工作。
字面值
考虑以下两个语句:
std::cout << "Hello world!";
int x { 5 };
‘”Hello world!”’ 和 ‘5’ 是什么?它们是字面值。字面值(也称为字面常量)是直接插入源代码中的固定值。
字面值和变量都有一个值(和一个类型)。与变量不同(变量的值可以通过初始化和赋值来设置和更改),字面值的值是固定的(5永远是5)。这就是为什么字面值被称为常量的原因。
为了进一步突出字面值和变量之间的区别,让我们来看一下这个简短的程序:
#include <iostream>
int main()
{
std::cout << 5 << '\n'; // 打印字面值的值
int x { 5 };
std::cout << x << '\n'; // 打印变量的值
return 0;
}
在第5行,我们将值5打印到控制台。当编译器编译这段代码时,它将生成代码,导致std::cout打印值5。这个值5被编译到可执行文件中,可以直接使用。
在第7行,我们创建了一个名为x的变量,并将其初始化为值5。编译器将生成代码,将字面值5复制到分配给x的内存位置。在第8行,当我们打印x时,编译器将生成代码,导致std::cout打印x的内存位置的值(该值为5)。
因此,两个输出语句都执行相同的操作(打印值5)。但在字面值的情况下,值5可以直接打印。在变量的情况下,值5必须从变量表示的内存中提取。
这也解释了为什么字面值是常量而变量可以更改。字面值的值直接放在可执行文件中,而可执行文件在创建后无法更改。变量的值放在内存中,而内存的值可以在可执行文件运行时更改。
字面值是直接插入源代码中的值。这些值通常会直接出现在可执行代码中(除非它们被优化掉)。
对象和变量代表存储值的内存位置。这些值可以根据需要获取。
运算符
在数学中,运算是涉及零个或多个输入值(称为操作数)并产生新值(称为输出值)的数学过程。要执行的具体操作由称为运算符的符号表示。
例如,小时候我们都知道2 + 3等于5。在本例中,字面值2和3是操作数,符号+是运算符,告诉我们对操作数应用数学加法以产生新值5。
在 C++ 中,操作按照您的预期进行。例如:
#include <iostream>
int main()
{
std::cout << 1 + 2 << '\n';
return 0;
}
在此程序中,字面值1
和2
是加号 ( +
) 运算符的操作数,它生成输出值3
。然后将该输出值打印到控制台。在 C++ 中,操作的输出值通常称为返回值。
您可能已经非常熟悉数学中常见的标准算术运算符,包括加法 ( +
)、减法 ( -
)、乘法 ( *
) 和除法 ( /
)。在 C++ 中,赋值 ( =
) 也是一个运算符,插入 ( <<
)、提取 ( >>
) 和相等 ( ==
) 也是运算符。虽然大多数运算符都有名称符号(例如+
、 或==
),但也有许多运算符是关键字(例如new
、delete
、 和throw
)。
对于符号运算符,通常会将运算符的符号附加到单词“operator”后面。例如,加法运算符将被写为operator+,提取运算符将被写为operator>>。
C++ 中的运算符有四种不同的类型:
一元运算符作用于一个操作数。一元运算符的一个例子是-
运算符。例如,给定-5
,operator-
获取字面操作数5
并翻转其符号以产生新的输出值-5
。
二元运算符作用于两个操作数(通常称为left和right,因为左操作数出现在运算符的左侧,右操作数出现在运算符的右侧)。二元运算符的一个例子是+
运算符。例如,给定3 + 4
,operator+
采用左操作数3
和右操作数4
并应用数学加法来产生新的输出值7
。插入 ( <<
) 和提取 ( >>
) 运算符是二元运算符,std::cout 或 std::cin 在左侧,要输出的值或要输入的变量在右侧。
三元运算符作用于三个操作数。C++ 中只有其中一种(条件运算符),我们稍后会介绍。
零元运算符作用于零操作数。C++ 中也只有其中之一(抛出运算符),我们稍后也会介绍。
请注意,某些运算符具有多种含义,具体取决于它们的使用方式。例如,operator-
有两个上下文。它可以以一元形式使用来反转数字的符号(例如转换5
为-5
,反之亦然),也可以以二进制形式使用来进行减法(例如4 - 3
)。
运算符执行顺序
运算符可以链接在一起,使一个运算符的输出可以作为另一个运算符的输入。例如,给定以下表达式:2 * 3 + 4,乘法运算符首先执行,将左操作数2和右操作数3转换为返回值6(它成为加法运算符的左操作数)。接下来,加法运算符执行,并将左操作数6和右操作数4转换为新值10。
我们将在深入研究运算符主题时更多地讨论运算符执行的顺序。目前,只需知道算术运算符的执行顺序与标准数学中的执行顺序相同:首先是括号,然后是指数,然后是乘法和除法,最后是加法和减法。
返回值和副作用
大多数C++运算符仅使用其操作数来计算返回值。例如,-5产生返回值-5,2 + 3产生返回值5。有一些运算符不产生返回值(例如delete和throw)。我们稍后会讨论它们的作用。
一些运算符具有附加行为。具有除产生返回值外的可观察效果的运算符(或函数)被称为具有副作用。
例如,赋值运算符(=)具有副作用,因为它会修改变量的值。考虑以下代码:
int x = 5;
在这里,赋值运算符将值5赋给变量x,这是一个具有副作用的操作。
又如,输出运算符(<<)也具有副作用,因为它会将内容输出到控制台。
具有副作用的运算符通常根据其副作用的行为而被调用,而不是根据它们产生的返回值(如果有的话)。这些运算符在执行后会影响程序的状态,而不仅仅是计算一个值。
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/cpp-literals-and-operators/