C语言的陷阱到C++的改进


进步不在于改善已有的东西,而是向着将要产生的东西前进。

重学C++_C语言的陷阱到C++的改进

字符语法的常见陷阱

C语言中常见的词法、语法问题

char c1 = 'yes'   //正确的
char c2 = “yes” ;  //错误的

const char* slash = "/";  //正确的
const char* slash2 = '/';  //错误的

C语言的考虑

  • C语言是高级语言中的低级语言,优点是小巧,高效,接近底层
  • 缺点是细节和陷阱比较多

C++的思考

  • 兼容C语言,同时推出既高效又易于大规模开发的机制,string类的使用

string类的使用

#include <iostream>
#include<string>
using namespace std;

int main()
{
    string s1(1, 'yes');
    cout << s1 << endl;//s

    string s2(3, 'yes');
    cout << s2 << endl;//sss

    string s3(1, 'y');
    cout << s3 << endl;// y
        
    string s4(" /");
    cout << s4 << endl;//      /
        
    string s5(1, '/');
    cout << s5 << endl;//     /
        
    string s6("yes");
    cout << s6 << endl;//yes

}

C语言数组退化问题

C语言指针和数组问题

问题表现

  • 数组在作参数时的退化行为

问题原因

  • 空间上进行节省,精巧的设计使得语言更精巧简单。

C++中的解决方案

  • STL容器及引用的使用,实现底层包装,保证效率同时,保证简单安全。

C语言移位运算问题

问题表现

逻辑右移还是算术右移

  • 右移只对无符号数

移位操作位数的限制

  • 移位数大于0,小于位数

问题原因

  • C在设计移位操作时需要考虑整数表示的上下文环境。

C++中的解决方案

  • bitset的使用

代码_bitset的使用

#include <bitset>
#include <iostream>
using namespace std;

int main()
{
    bitset<10> priv = 0xff;
    bitset<10> P_BAKCUP = (1 << 6);
    bitset<10> P_ADMIN = (1 << 7);

    cout << priv << endl;
    cout << P_BAKCUP << endl;
    cout << P_ADMIN << endl;

    if ((priv & P_BAKCUP) == P_BAKCUP)
    {
        cout << "BAKCUP" << endl;
    }
    if ((priv & P_ADMIN) == P_ADMIN)
    {
        cout << "ADMIN" << endl;
    }
}

C语言强制类型转换问题

问题表现

  • 隐藏的bug和陷阱
  • 滥用类型转换可能导致灾难性后果,且很难排

问题原因

  • 类型转换在底层语言中的运用很广泛,灵活方便

C++中的解决方案

  • 分类便于排查隐藏bug,复杂性鼓励减少使用static_cast, const_cast, dynamic_cast, reinterpret_cast

C语言整数溢出问题

问题表现

  • C语言中关于整数的表示
  • C语言中的整数不等于数学上的整数

问题原因

  • 和系统的设计有关系

C++中的解决方案

代码_boost库

VS中包含目录(boost库)

工程文件(右键) → 属性 → VC++目录 → 包含目录

boost库示例(文档)

cpp_int

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using namespace boost::multiprecision;

int main()
{
    //例子1 - 注释为C语言的实现
    //int i = 2147483640;
    //for (; i > 0; i++)
    //{
    //    cout << "add" << endl;
    //}
    //    cout << "exit" << endl;

    cout << " boost::multiprecision;" << endl;
    cpp_int  i2 = 2147483640;
    for (; i2 > 0; i++)
    {
        cout << "add" <<i2<< endl;
    }
    cout << "exit" << i2<<endl;

    //例子2 - 注释为C语言的实现
   //int a = 500;
   //int b = 500;
   //int c = 500;
   //int d = 500;
   //cout << a*b*c*d << endl;

   cout << " boost::multiprecision;" << endl;
   cpp_int a = 500;
   cpp_int b = 500;
   cpp_int c = 500;
   cpp_int d = 500;
   cout << a * b * c * d << endl;

}

C语言字符串典型缺陷

问题表现

  • \0’结束符,表达能力的天生缺陷
  • 运行效率低

问题原因

  • 特殊场景的,有针对性的设计问题。

C++中的解决方案

代码_C

  • 如果代码提示警告,可在工程文件(右键) → 属性 → 预处理器 → 预处理器定义内加上_CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

static const int MAX_LEN = 30;
int main()
{
    char str1[] = "string";
    cout << strlen(str1) << endl;   //6
    cout << sizeof(str1) / sizeof(str1[0]) << endl;    //7

    char str2[] = "stri\0ng";
    cout << strlen(str2) << endl;   //4
    cout << sizeof(str2) / sizeof(str2[0]) << endl;    //8

    char str1A[MAX_LEN] = "stringA";
    strcat(str1A, str2);
    cout << str1A << endl;   //stringAstri
    cout << strlen(str1A) << endl; //11
    cout << sizeof(str1A) / sizeof(str1A[0]) << endl;      //30

}

代码_C++改进

#include <iostream>
#include <string>
using namespace std;

static const int MAX_LEN = 30;
int main()
{
    char str1[] = "string";
    cout << strlen(str1) << endl;   //6
    cout << sizeof(str1) / sizeof(str1[0]) << endl;    //7

    char str2[] = "stri\0ng";
    cout << strlen(str2) << endl;   //4
    cout << sizeof(str2) / sizeof(str2[0]) << endl;    //8

    char str1A[MAX_LEN] = "stringA";
    strcat(str1A, str2);
    cout << str1A << endl;   //stringAstri
    cout << strlen(str1A) << endl; //11
    cout << sizeof(str1A) / sizeof(str1A[0]) << endl;      //30


    cout << "c++改进" << endl; 
    string  sstr1 = "string";
    cout << sstr1.length() << endl;  //4
    cout << sstr1.capacity() << endl;//15
    cout << sizeof(sstr1) << endl; //40

    cout << "c++改进_sstr2" << endl;
    string  sstr2 = "stri\0ng";
    cout << sstr2.length() << endl;  //4
    cout << sstr2.capacity() << endl;//15
    cout << sizeof(sstr2) << endl;//40

    cout << "c++改进_sstr1++++++" << endl;
    sstr1 += sstr2;
    cout << sstr1.length() << endl;  //10
    cout << sstr1.capacity() << endl;//15
    cout << sizeof(sstr1) << endl;//40

}

声明:三二一的一的二|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - C语言的陷阱到C++的改进


三二一的一的二