首页 > 编程语言 >C++中的魔鬼数字

C++中的魔鬼数字

时间:2024-10-15 23:11:41浏览次数:7  
标签:魔鬼 数字 代码 C++ 线程 具名 常量

在编程中,魔鬼数字(magic numbers)是指代码中直接使用的未经解释的常量数字,这些数字通常没有明确的含义,可能会使代码变得难以理解、维护或扩展。魔鬼数字的存在会让人难以判断这些数字的用途或来源,因此在代码中通常建议避免使用魔鬼数字,而是用具名的常量或宏来代替。

在你提供的示例代码中,以下几个数字可以被认为是魔鬼数字

魔鬼数字示例

  1. 3:表示创建的线程数量。

    • 原代码: const int numThreads = 3;
    • 解释:这里 3 表示程序中要创建的线程数量。为了使代码更具可读性,可以将这个数字替换为一个具名的常量。
  2. 2:用于 sleep(2),表示线程要休眠2秒。

    • 原代码: sleep(2);
    • 解释:这个数字表示线程的休眠时间,直接使用会让人困惑为什么选择2秒。可以用一个具名的常量来替代它,以解释这段休眠的目的。

改进后的代码

为了消除魔鬼数字,可以将它们替换为具名常量或宏,以增强代码的可读性和可维护性:

#include <iostream>
#include <pthread.h>
#include <unistd.h>  // sleep 函数

// 定义具名常量
const int NUM_THREADS = 3;           // 线程数量
const int THREAD_SLEEP_DURATION = 2; // 每个线程休眠的秒数

// 线程执行的函数
void* threadFunc(void* arg) {
    int* id = static_cast<int*>(arg);  // 传入的参数类型转换
    std::cout << "Thread " << *id << " is running." << std::endl;
    sleep(THREAD_SLEEP_DURATION);  // 使用具名常量代替魔鬼数字
    std::cout << "Thread " << *id << " has finished." << std::endl;
    return nullptr;
}

int main() {
    pthread_t threads[NUM_THREADS];  // 使用具名常量代替魔鬼数字
    int threadArgs[NUM_THREADS];

    // 创建多个线程
    for (int i = 0; i < NUM_THREADS; ++i) {
        threadArgs[i] = i + 1;  // 为每个线程传递不同的参数
        if (pthread_create(&threads[i], nullptr, threadFunc, &threadArgs[i]) != 0) {
            std::cerr << "Error creating thread " << i + 1 << std::endl;
            return 1;
        }
    }

    // 等待所有线程完成
    for (int i = 0; i < NUM_THREADS; ++i) {
        if (pthread_join(threads[i], nullptr) != 0) {
            std::cerr << "Error joining thread " << i + 1 << std::endl;
            return 1;
        }
        std::cout << "Thread " << i + 1 << " has joined." << std::endl;
    }

    std::cout << "All threads have completed." << std::endl;
    return 0;
}

改进的地方:

  1. NUM_THREADS: 代替了数字 3,表示线程的数量。这样如果未来需要更改线程数量,只需要修改这个常量即可,增强了代码的可扩展性。
  2. THREAD_SLEEP_DURATION: 代替了 sleep(2) 中的 2,明确表示线程的休眠时间,这使代码更加清晰,并且能够解释为什么线程需要休眠。

这样做的好处:

  • 可读性:具名常量提供了上下文信息,告诉代码的读者这些数字的含义。
  • 可维护性:如果需要更改这些常量的值,只需修改一处,减少了错误的可能。
  • 可扩展性:当需要扩展代码时,使用具名常量可以让代码更容易修改和理解。

避免魔鬼数字是编程中的一个重要实践,可以显著提高代码的质量。

标签:魔鬼,数字,代码,C++,线程,具名,常量
From: https://www.cnblogs.com/chentiao/p/18468745

相关文章

  • C++中的回调函数
    回调函数(callbackfunction)是指作为参数传递给另一个函数的函数,在某个事件发生或某个任务完成时被调用。回调函数在异步编程中非常常见,因为它们允许代码在某个操作完成后自动执行某些行为,而无需阻塞程序。回调函数的基本特征作为参数传递:回调函数通常是作为参数传递给另一个函......
  • 实验1 现代C++ 基础课程
    任务1:运行结果如图:     任务2:运行结果如图:任务3:运行结果如图: 任务4:运行结果如图:任务5:运行结果如图: 任务6: ......
  • C++中如何使用单例模式管理全局变量
    单例模式(SingletonPattern)是一种常用的设计模式,旨在确保一个类只有一个实例,并提供一个全局的访问点。要使用单例模式管理全局变量,可以通过控制类的实例化过程,防止多个对象的创建。这样做不仅可以保证数据一致性,还能避免使用直接的全局变量带来的命名冲突和潜在的多线程安全问题。......
  • 【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻
    文章目录C++双指针详解:进阶题解与思维分析前言第一章:有效三角形的个数1.1有效三角形的个数示例1:示例2:解法一(暴力求解)解法二(排序+双指针)易错点提示代码解读第二章:和为s的两个数字2.1和为s的两个数字示例1:解法一(暴力解法)解法二(双指针-对撞指针)第三章:三......
  • C++互斥锁
    互斥锁(Mutex,全称:MutualExclusion)是一种用于多线程编程中的同步机制,用来确保在同一时刻只有一个线程可以访问共享资源。它通过锁定机制防止多个线程同时对共享资源进行读写操作,从而避免数据竞争和不一致性问题。互斥锁的核心思想是保证互斥访问,即当一个线程持有互斥锁并正在访问......
  • c++实验1
    实验任务1:1#include<iostream>2#include<string>3#include<vector>4#include<algorithm>5usingnamespacestd;6template<typenameT>7voidoutput(constT&C);8voidtest1();9voidtest2();10voidtest......
  • C++中的不安全函数
    不安全函数(UnsafeFunctions)通常指那些在特定条件下可能导致程序错误、数据损坏或安全漏洞的函数。在编程中,不安全函数可能表现为以下几种情况:缓冲区溢出:当函数在处理数据时没有检查输入的大小,可能导致超出预分配内存空间的写入,造成数据破坏或程序崩溃。例如,在C和C++中,strcpy、......
  • 【数据结构】:破译排序算法--数字世界的秩序密码(二)
    文章目录前言一.比较排序算法1.`BubbleSort`冒泡排序1.1.冒泡排序原理1.2.冒泡排序过程1.3.代码实现1.4.复杂度和稳定性2.`QuickSort`快速排序2.1递归快速排序2.1.1.递归快速排序原理2.1.2.递归快速排序过程2.1.3.代码实现2.2.非递归快速排序2.2.1.非递归快速排序原......
  • 实验一 现代C++编程初体验
    任务1//现代C++标准库、算法库体验//本例用到以下内容://1.字符串string,动态数组容器类vector、迭代器//2.算法库:反转元素次序、旋转元素//3.函数模板、const引用作为形参#include<iostream>#include<string>#include<vector>#include<algorithm>using......
  • C++(nullptr、类型推导、初始化列表、)
    1.nullptr(掌握)nullptr是C++11推出的新的空指针,用于代替C语言的NULL。#include<iostream>usingnamespacestd;voidfunc(inti){cout<<"A"<<i<<endl;}voidfunc(char*c){cout<<"B"<<c<<en......