C++ 变量和类型:Int、Char、Float、 Double、字符串和布尔值

变量在 C++

A C++ 变量为我们提供了命名存储功能。它允许程序员根据需要操作数据。每个变量都有一个类型 C++变量类型有助于确定变量的内存映射的大小和布局、可存储在该内存中的值的范围以及可对其应用的操作集。

基本变量类型 C++

以下是基本类型 C++ 变量:

内部:

整数是数字文字(与数字相关),不带任何小数或指数部分。例如 120、-90 等。

Double:

这是一个双精度浮点值。例如:11.22、2.345

字符:

字符文字是通过将单个字符括在单引号内来创建的。例如:“a”、“m”、“F”、“P”、“}”等。

漂浮:

浮点文字是具有分数形式或指数形式的数字文字。例如:1.3、2.6

字符串字面量:

字符串文字是用双引号括起来的字符序列。例如:“你好吗?”

布尔值:

它保存布尔值真或假。

声明变量的规则 C++

以下是命名变量的一些常见规则:

  • A C++ 变量名只能有字母、数字和下划线。
  • A C++ 变量名不能以数字开头。
  • 变量名不应该以大写字符开头。
  • 用于的变量名 C++ 不能是关键字。例如,int 是用于表示整数的关键字。
  • A C++ 变量名可以以下划线开头。然而,这并不是一个好的做法。

C++ 变量数据类型

C++ 定义一整套原始类型

- 无效 type 没有关联值,只能在少数情况下使用。它最常见的用途是作为不返回值的函数的返回类型。

- 算术类型 包括字符、整数、布尔值和浮点数。算术类型又分为2类

  1. 浮点类型。浮点数(或浮点类型)表示十进制数。IEEE 标准指定了有效数字的最小位数。大多数编译器通常提供比指定最小值更高的精度。通常,浮点数用 32 位表示,双精度数用 64 位表示,长双精度数用 96 位或 128 位表示。
  2. 整数类型 (包括字符、整数和布尔类型)。 布尔 type 只有两种类型的值:True 或 False。有几种 坦克 类型,其中大多数都是为了支持国际化而存在的。最基本的字符类型是 char。char 的大小与单个机器字节相同,即单个字节。

- 整数类型 可以是签名的,也可以是未签名的。

有符号类型:它们表示负数或正数(包括零)。在有符号类型中,范围必须在 +ve 和 -ve 值之间均匀分布。因此,8 位有符号字符将保存从 -127 到 127 的值。

无符号类型:在无符号类型中,所有值均 >= 0。8 位无符号字符可以包含 0 到 255(包括 XNUMX 和 XNUMX)。

C++ 变量数据类型

变量名称或标识符

标识符可以由一些字母、数字和下划线字符或它们的组合组成。名称长度没有限制。

标识符必须

  • 以字母或下划线 ('_') 开头。
  • 并且区分大小写;大写字母和小写字母有区别:

// 定义四个不同的 int 变量

int guru99, gurU99, GuRu99, GURU99;

- C++ 语言保留了一些名称供其使用。

变量名称或标识符

在命名变量时,有许多公认的惯例 不同的编程语言.遵循这些约定可以提高程序的可读性。

  • 标识符应该至少给出一些其含义的指示。
  • 变量名通常都是小写的——guru99,而不是Guru99或GURU99。
  • 我们定义的类通常以大写字母开头。
  • 包含多个单词的标识符应在视觉上区分每个单词。例如,guru99_website 而不是 guru99website。

C++ 变量声明和定义

变量声明使程序在其定义范围内知道该名称。例如:

int a=5;
int b;
char c='A'; 
int a,b;
a=b=1000;
List initialization
int a(5);
int b{5};

Const 限定符 C++

假设有一个变量 buffsize,它表示要从用户那里获取的输入数量。在这里,我们不想在整个程序中改变 buffsize 的值。我们希望定义一个我们知道其值不会改变的变量。

在这种情况下,使用关键字 const

const int bufSize = 512;    // input buffer size

这将 bufSize 定义为常量。任何试图分配或更改 bufSize 的行为都会导致错误。

这里,我们不能在创建 const 对象后改变它的值,它必须被声明和初始化。否则编译器会抛出错误。

const int i = get_size();  // ok: initialized at run time
const int j = 42;          // ok: initialized at compile time
const int k;               // error: k is uninitialized const
int i = 42;
const int ci = i;    	   // ok: the value in i is copied into ci 

变量的作用域 C++

作用域是程序中变量具有意义的一段范围。通常,同一个名称可用于指代不同作用域内的不同实体。变量从声明点开始一直到声明所在的作用域结束都可见。

#include <iostream>	
int main()	
{	
    int sum = 0;	
    // sum values from 1 through 10 inclusive	
    for (int val = 1; val <= 10; ++val)	
        sum += val;  // equivalent to sum = sum + val	
    cout << "Sum of 1 to 10 inclusive is "<< sum <<endl;	
    return 0;	
}	 

此程序定义了 3 个名称,即 main、sum 和 val。它使用命名空间名称 std,以及该命名空间中的另外两个名称 — cout 和 endl。

  • 函数名“main”在花括号外定义。函数名 main — 与大多数在函数外定义的其他名称一样 — 具有全局作用域。这意味着一旦声明,位于 全球视野 在整个程序过程中均可访问。
  • 变量 sum 在块(即 main 函数的主体)的范围内定义。可以从其声明点以及 main 函数主体的其余部分访问它。但是,不能在它之外访问。这意味着变量 sum 具有 块范围.
  • 变量 val 是在“for 语句”的范围内定义的。它可以轻松地在该语句中使用,但不能在主函数的其他地方使用。它有 局部范围.

嵌套作用域

作用域可以包含其他作用域。被包含(或嵌套)的作用域称为内部作用域。包含作用域称为外部作用域。

#include <iostream>	
using namespace std;	
// Program for illustration purposes only: It is bad style for a function	
// to use a global variable and also define a local variable with the same name	
int reused = 42;  // reused has global scope	
int main()	
{	
    int unique = 0; // unique has block scope	
    // output #1: uses global reused; prints 42 0	
    cout << reused << " " << unique << endl;	
    int reused = 0; // new, local object named reused hides global reused	
    // output #2: uses local reused; prints 0 0	
    cout << reused << " " << unique << endl;	
    // output #3: explicitly requests the global reused; prints 42 0	
    cout << ::reused << " " << unique << endl;	
    return 0;	
}	 

输出 #1 出现在重用局部定义之前。因此,此输出

语句是使用在全局范围内定义的名称reuse的语句。此语句输出

42 0

输出 #2 发生在reused的局部定义之后。它现在在范围内。因此,第二个输出语句只是使用名为reused的局部对象而不是全局对象,并输出

0 0

输出 #3 使用覆盖默认范围规则 范围运算符。全局作用域没有名称。因此,当作用域运算符 (::) 左侧为空时。它将其解释为获取全局作用域右侧名称的请求。因此,表达式使用全局重用并输出

42 0

变量类型转换

一种类型的变量可以转换为另一种类型。这称为“类型转换”。让我们看看转换不同类型的规则 C++ 变量类型:

如果将非布尔值分配给布尔变量,则当其值为 0 时,结果为 false,否则为 true。

bool b = 42;            // b is true

将 bool 分配给其他算术类型之一时,如果 bool 为真则结果为 1,如果 bool 为假则结果为 0。

bool b = true;
int i = b;              // i has value 1

将浮点值赋给 int 类型的变量会产生被截断的值。存储的值是小数点前的部分。

int i = 3.14;               // i has value 3

将 int 值赋给 float 类型的变量会导致小数部分变为零。如果整数的位数多于浮点变量所能容纳的位数,通常会损失精度。

Int i=3;
double pi = i;          // pi has value 3.0

如果我们尝试将超出范围的值分配给无符号类型的变量,则结果是该值的余数 %(模数)

例如,8 位无符号字符类型可以保存从 0 到 255(含)的值。如果赋值超出此范围,编译器将赋值该值对 256 取余。因此,根据上述逻辑,将 -1 赋值给 8 位无符号字符将使该对象获得值 255。

unsigned char c = -1;   // assuming 8-bit chars, c has value 255

如果我们尝试将超出范围的值赋给有符号类型的对象,则结果是不可预测的。它是未定义的。该程序可能在外部看起来可以正常工作,也可能崩溃,也可能产生垃圾值。

signed char c2 = 256;   // assuming 8-bit chars, the value of c2 is undefined

当我们使用一种类型的值而需要另一种类型的值时,编译器会应用这些相同类型的转换。

int i = 42;
if (i) // condition will evaluate as true
i = 0; 

如果此值 = 0,则条件为假;所有其他(非零)值都为真。按照同样的概念,当我们在算术表达式中使用布尔值时,其值始终会转换为 0 或 1。因此,在算术表达式中使用布尔值通常几乎肯定是错误的。

警告:不要混合有符号和无符号类型

混合有符号和无符号的表达式在有符号值为负时会产生令人惊讶的错误结果。如上所述,有符号值会自动转换为无符号。

例如,在如下算术表达式中

x* y

如果 x 为 -1 且 y 为 1,并且 x 和 y 都是 int,则该值如预期那样为 -1。

如果 x 是 int 而 y 是无符号的,则此表达式的值取决于编译机器上的整数有多少位。在我们的机器上,此表达式得出 4294967295。

注册变量

与内存变量相比,寄存器变量的访问速度更快。因此,在程序中经常使用的变量 C++ 程序可以使用以下方式放入寄存器中 寄存器 关键字。register 关键字告诉编译器将给定变量存储在寄存器中。是否将其放入寄存器是编译器的选择。通常,编译器本身会进行各种优化,包括将一些变量放入寄存器中。一个程序中寄存器变量的数量没有限制 C++ 程序。但编译器可能不会将变量存储在寄存器中。这是因为寄存器内存非常有限,并且通常由操作系统使用。

界定:

register int i;

评论

注释是编译器忽略的代码部分。它允许程序员在源代码/程序的相关区域做笔记。注释可以以块形式或单行形式出现。程序注释是解释性语句。它可以包含在 C++ 代码可以帮助任何人阅读其源代码。所有编程语言都允许某种形式的注释。 C++ 支持单行和多行注释。

  • 单行注释 是以 // 开头并持续到行末​​的注释。如果注释行中的最后一个字符是 \,则注释将在下一行继续。
  • 多行注释 以 /* 开头并以 */ 结尾。
/* This is a comment */
/* C++ comments can  also 
* span multiple lines 
*/

转义序列

有些字符(例如退格符和控制符)没有可见的图像。此类字符称为不可打印字符。其他字符(单引号和双引号、问号和反斜杠)在许多编程语言中具有特殊含义。

我们的程序无法直接使用任何这些字符。相反,我们可以使用转义序列来表示此类字符。转义序列以反斜杠开头。

- C++ 编程语言 定义了几个转义序列:

它有什么作用呢? 字符
新队 \n
垂直标签 \v
反斜杠 \\
回车 \r
水平标签 \t
Backspace键 \b
问号 \?
换页 \f
警示(铃声) \a
Double 报价
单引号 \'

我们使用转义序列就好像它是一个单个字符一样:

cout << '\n';        // prints a newline
cout << "\tguru99!\n";   // prints a tab followed by "guru99!" and a newline 

我们还可以编写通用转义序列 \x,后跟一个或多个十六进制数字。或者我们使用 \,后跟一个、两个或三个八进制数字。通用转义序列表示字符的数值。以下是一些示例(假设 Latin-1 字符集):

\7 (bell)    \12 (newline)      \40 (blank)
\0 (null)    \115 ('M')         \x4d ('M') 

我们可以使用预定义的转义序列,就像使用任何其他字符一样。

cout << "Hi \x4dO\115!\n";  // prints Hi MOM! followed by a newline
cout << '\115' << '\n';     // prints M followed by a newline 

总结

  • A C++ 变量为我们提供了命名的存储能力。
  • C++ 变量类型:int、double、 坦克、浮点数、字符串、布尔值等。
  • 被包含(或嵌套)的作用域称为内部作用域,包含该作用域的作用域称为外部作用域。
  • 一种类型的变量可以转换为另一种类型。这称为“类型转换”。
  • 与内存变量相比,寄存器变量的访问速度更快。
  • 注释是编译器忽略的代码部分。
  • 某些字符(例如退格符和控制字符)没有可见的图像。