[C++ 14 の新機能] C++14 数値区切り記号: 深い理解と実践


1 はじめに

1.1 C++14 数値区切り記号の概要と意味

C++14 では、新しい文法機能である数値区切り記号 (桁区切り記号、「単一アンダースコア」とも呼ばれる) が導入されています。この機能の導入は、主にコードの可読性を向上させることを目的としています。多数の数値、特に長い数値文字列を扱う場合、数値区切り記号を使用すると、数値のサイズと単位をより明確に確認できます。

たとえば、長整数を と1000000000書くことができ1'000'000'000、これにより、それが 10 億であることが一目で分かりやすくなります。同様に、 2 進数を として11011011100110111011110011011111書くことができます1101'1011'1001'1011'1011'1110'0110'1111。これにより、各バイトの値を確認しやすくなります。

この機能は、すでに同様の機能をサポートしている Java や Python などの他の最新のプログラミング言語との一貫性を保つために C++14 に導入されました。

次の章では、C++14 数値区切り記号の使用方法と、コードの可読性と保守性を向上させる利点について詳しく説明します。

始める前に、C++14 の数値区切り文字の使用方法を示す簡単なコード例を見てみましょう。

#include <iostream>

int main() {
    
    
    int billion = 1'000'000'000;
    std::cout << "One billion is: " << billion << std::endl;
    return 0;
}

この例では、 という名前の整変数を定義しbillion、数値区切り文字を使用してその値を書き込みます1'000'000'000次に、この値を出力します。このコードは非常に単純ですが、コードの読みやすさを向上させるために数値区切り文字を使用する方法を明確に示しています。

2. C++14 数値区切り文字の基本的な使用法

2.1 文法規則

C++14 では、新しい機能である Number Separator (Number Separator、Number Literal Separator とも呼ばれます) が導入されています。この機能を使用すると、数値リテラルに一重引用符を挿入して、'コードの読みやすさを向上させることができます。この区切り文字は数値間のどこにでも挿入でき、複数挿入することもできます。

たとえば、長整数を、浮動小数点数を と1000000000書くことができますそうすることで、数値が読みやすく、理解しやすくなります。1'000'000'00012345678.9012'345'678.90

2.2 サンプルコード

数値区切り文字を使用するコード例を次に示します。

#include <iostream>

int main() {
    
    
    // 使用数字分隔符定义整数
    int billion = 1'000'000'000;
    std::cout << "One billion: " << billion << std::endl;

    // 使用数字分隔符定义浮点数
    double pi = 3.141'592'653;
    std::cout << "Pi: " << pi << std::endl;

    // 使用数字分隔符定义二进制数
    int binary = 0b1101'0110;
    std::cout << "Binary: " << binary << std::endl;

    return 0;
}

このコードでは、数値区切り文字を使用して整数、浮動小数点数、および 2 進数を定義しました。ご覧のとおり、数値区切り記号を使用すると、数値が読みやすく理解しやすくなります。

2.3 文法規則の概要

次の表は、数値区切り文字に関するいくつかの基本的なルールをまとめたものです。

ルール 説明
位置 区切り文字は数値間のどこにでも挿入できます
複数のセパレータを挿入できます
タイプ 整数、浮動小数点数、2進数、8進数、16進数で使用可能

3. コードの可読性に対する C++14 数値区切り文字の影響

3.1 比較分析: 数字区切り文字を含むコードと含まないコード

C++14 より前では、通常、次のように大きな数値を記述します。

int billion = 1000000000;

一目見ただけではこの数字が何であるかを判断するのは困難です。しかし、C++14 では、数値区切り文字 (桁区切り文字、') を使用してこの問題を改善できます。

int billion = 1'000'000'000;

このようにすると、その数が 10 億であることが簡単にわかります。

3.2 大規模プロジェクトにおける数字区切り記号の適用

在大型项目中,数字分隔符可以帮助我们更好地理解和维护代码。例如,我们可能需要处理一些特定的硬件寄存器,这些寄存器的地址通常是固定的,并且可能非常大。使用数字分隔符,我们可以更清楚地看出这些地址的值。

// Without digit separator
uint32_t register_address = 0x12345678;

// With digit separator
uint32_t register_address = 0x1234'5678;

在这个例子中,使用数字分隔符可以帮助我们更清楚地看出寄存器地址的值。

3.2.1 使用数字分隔符的好处

使用数字分隔符的好处主要有以下几点:

  1. 提高代码的可读性:使用数字分隔符可以使大数字更易于阅读和理解。
  2. 减少错误:在处理大数字时,很容易出现错误。使用数字分隔符可以帮助我们减少这种错误。
  3. 提高代码的维护性:在大型项目中,使用数字分隔符可以使代码更易于维护。

4. C++14 数字分隔符在性能上的影响

4.1 编译器的处理方式

在C++14中,数字分隔符(digit separator, 数字分隔符)被设计为一个纯粹的语法糖,这意味着它在编译时会被完全忽略。换句话说,数字分隔符对编译器来说是透明的,它们在编译过程中不会产生任何额外的开销。例如,数字1'000'0001000000在编译后的机器代码中是完全相同的。

4.2 性能测试与分析

虽然理论上数字分隔符不会影响程序的性能,但为了验证这一点,我们可以进行一些基准测试。下面的代码示例展示了一个简单的性能测试,比较了使用和不使用数字分隔符的代码的运行时间。

#include <iostream>
#include <chrono>

int main() {
    
    
    auto start = std::chrono::high_resolution_clock::now();

    // 使用数字分隔符
    for (long long i = 0; i < 1'000'000'000; ++i) {
    
    
        // Do something
    }

    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> diff = end-start;
    std::cout << "Time with digit separators: " << diff.count() << " s\n";

    start = std::chrono::high_resolution_clock::now();

    // 不使用数字分隔符
    for (long long i = 0; i < 1000000000; ++i) {
    
    
        // Do something
    }

    end = std::chrono::high_resolution_clock::now();
    diff = end-start;
    std::cout << "Time without digit separators: " << diff.count() << " s\n";

    return 0;
}

在多次运行这个测试后,你会发现使用和不使用数字分隔符的代码的运行时间几乎没有差异。这证实了我们之前的观点:数字分隔符不会对程序的性能产生影响。

在下表中,我们对比了使用和不使用数字分隔符的代码的性能。

代码类型 平均运行时间
使用数字分隔符 1.000s
不使用数字分隔符 1.000s

这个表格清楚地显示了,无论是否使用数字分隔符,代码的运行时间都是一样的。

在理解这个结果时,我们需要回到编译器的角度。编译器在处理代码时,会忽略数字分隔符,因此,它们不会对生成的机器代码产生任何影响。这就是为什么使用和不使用数字分隔符的代码在性能上没有差异的原因。

5. C++14 数字分隔符在特殊情况下的应用

在本章中,我们将探讨C++14数字分隔符在特殊情况下的应用,包括在二进制、八进制和十六进制中的应用,以及在浮点数中的应用。

5.1 在二进制、八进制和十六进制中的应用

C++14数字分隔符不仅可以用于十进制数,也可以用于二进制(binary)、八进制(octal)和十六进制(hexadecimal)数。这使得在处理大量的非十进制数时,代码的可读性大大提高。

以下是一个示例,展示了如何在二进制、八进制和十六进制数中使用数字分隔符:

// 二进制
int binary = 0b1010'1011'1100'1101;
// 八进制
int octal = 012'34'56'70;
// 十六进制
int hexadecimal = 0x12'34'56'78;

5.2 在浮点数中的应用

C++14数字分隔符也可以用于浮点数(floating point numbers)。这使得在处理大量的浮点数时,代码的可读性也得到了提高。

以下是一个示例,展示了如何在浮点数中使用数字分隔符:

// 浮点数
double pi = 3.141'592'653'589'793;

在这个例子中,我们使用了数字分隔符来分隔pi的各个部分,使得代码更易于阅读。

注意事项

在使用C++14数字分隔符时,需要注意以下几点:

  1. 数字分隔符不能放在数字的开头或结尾。
  2. 数字分隔符不能放在十六进制数的0x、八进制数的0或二进制数的0b后面。
  3. 在浮点数中,数字分隔符不能放在小数点的前后。

以上就是C++14数字分隔符在特殊情况下的应用。在下一章中,我们将探讨C++14数字分隔符的注意事项。

6. C++14 数字分隔符的注意事项

在本章中,我们将深入探讨C++14数字分隔符的一些注意事项,包括兼容性问题和常见错误及其解决方法。我们将通过一个综合的代码示例来展示这些问题,并提供相应的解决方案。

6.1 兼容性问题

C++14引入的数字分隔符是一个非常有用的特性,它可以提高代码的可读性,但是我们需要注意,这是C++14才引入的特性,如果我们的代码需要在只支持C++11或更早版本的编译器上运行,那么使用数字分隔符可能会导致编译错误。

例如,下面的代码在C++14或更高版本的编译器上可以正常编译和运行:

int main() {
    
    
    int billion = 1'000'000'000;  // C++14
    return 0;
}

但是在只支持C++11的编译器上,这段代码会导致编译错误。

解决这个问题的方法是,如果我们的代码需要在旧版本的编译器上运行,那么我们就不应该使用数字分隔符。或者,我们可以通过预处理指令来检查编译器的版本,只在支持数字分隔符的编译器上使用这个特性:

int main() {
    
    
    #if __cplusplus >= 201402L
        int billion = 1'000'000'000;  // C++14
    #else
        int billion = 1000000000;     // C++11
    #endif
    return 0;
}

6.2 常见错误和解决方法

6.2.1 错误的分隔符位置

数字分隔符可以放在两个数字之间,但不能放在数字的开头或结尾,也不能连续使用两个或更多的分隔符。下面是一些错误的使用方法:

int main() {
    
    
    int x = 1'000';  // 正确
    int y = '1'000;  // 错误:分隔符不能放在数字的开头
    int z = 1'000''000;  // 错误:不能连续使用两个分隔符
    return 0;
}

如果我们在编写代码时犯了这样的错误,编译器会给出错误信息,我们只需要根据错误信息修改代码即可。

6.2.2 分隔符在浮点数中的使用

在浮点数中,我们可以在整数部分和小数部分使用数字分隔符,但不能在指数部分使用。例如:

int main() {
    
    
    double x = 1'000.000'1;  // 正确
    double y = 1'000e1'000;  // 错误:不能在指数部分使用分隔符
    return 0;
}

如果我们在编写代码时犯了这样的错误,编译器会给出错误信息,我们只需要根据错误信息修改代码即可。

6.2.3 分隔符在前缀和后缀中的使用

在使用数字前缀(如0x表示十六进制,0b表示二进制)或后缀(如u表示无符号整数,f表示浮点数)时,我们不能在前缀或后缀和数字之间使用分隔符。例如:

int main() {
    
    
    int x = 0b1010'1010;  // 正确
    int y = 0b'1010'1010;  // 错误:不能在前缀和数字之间使用分隔符
    float z = 1.23'f;  // 错误:不能在数字和后缀之间使用分隔符
    return 0;
}

如果我们在编写代码时犯了这样的错误,编译器会给出错误信息,我们只需要根据错误信息修改代码即可。

在下表中,我们总结了数字分隔符的正确和错误的使用方法:

使用场景 正确的使用方法 错误的使用方法
在整数中使用 int x = 1'000'000; int y = '1'000'000;
int z = 1'000''000;
在浮点数中使用 double x = 1'000.000'1; double y = 1'000e1'000;
在前缀和后缀中使用 int x = 0b1010'1010;
float z = 1.23f;
int y = 0b'1010'1010;
float z = 1.23'f;

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。


阅读我的CSDN主页,解锁更多精彩内容:泡沫的CSDN主页
在这里插入图片描述

おすすめ

転載: blog.csdn.net/qq_21438461/article/details/131634791