C/C++编程的常识和注意点(不断更新)

本文总结了C/C++编程中的关键知识点,包括STL容器的使用方法、基本数据类型的取值范围、输入输出格式及注意事项等。适用于初学者快速入门及进阶提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于编程过程中经常会遗忘一些C/C++的代码编写规则、函数使用规则(参数和返回值含义)等,所以每次都重新查阅百度,非常麻烦,所以稍微整理一下它们的注意点和知识点,欢迎指正~

常用STL、库函数

STL

库函数

  • C语言string.hstring.h中常用函数
  • memset(b, a, sizeof(int)*k)用于将数组a中的k个int单元复制到b所指向的数组

数值类型

  • C语言中常用的基本数据类型的取值范围
数据类型字节数取值范围(数量级)
char1 Bytes-128 ~ +127
int (long)4 Bytes-2147483648 ~ +2147483647 (1010)
unsigned int4 Bytes0 ~ 4294967295 (1010)
long long int8 Bytes-9223372036854775808 ~ +9223372036854775807 (1020)
double8 Bytes±1.7 * 10308 (有效精度16位)
  • 数据类型的输入输出格式(Mingw64_GCC)
数据类型输入格式输出格式
charscanf(“%c”, &c);
cin >> c;
printf(“%c”,c);
cout << c;
intscanf(“%d”, &a);
cin >> a;
printf(“%d”, a);
cout << a;
doublescanf(“%lf“,&a);
cin >> a;
printf(“%f“, a);
cout << a;
stringscanf(“%s”, str);
cin >> str;
printf(“%s”,str);
cout << str;

需要注意的是
  C语言中输出浮点数(不管是float还是double)都是”%f”,如果用”%lf”会输出0.00000;”%.xlf”表示保留x位小数。
  C++中输出浮点数默认为6位数据(含小数点,如123.45);
  C++设置浮点数输出位数:
  #include "iomanip"
  cout << setiosflags(ios::fixed) << setprecision(4)<< a <<endl; //浮点数形式
  cout << setiosflags(ios::scientific) << setprecision(4) << a << endl; //指数形式 printf("%e", a);

  • 在%和d之间插入数字来读取特定位数:例如,输入时用%4d来读取八位数的前四位年份,%2d%2d来读取月和日,比手动截取字符串子串方便多了:)

  • 浮点数与整型数尽量不要用==或!=比较。浮点数在运算时容易丢失精度,导致比较时发生异常,比如下面的程序会导致死循环,如果非要比较,请用floor(i)或强制类型转换:

int main(int argc, char const *argv[])
{
    double i;
    for (i = 0; i != 10; i += 0.1) //用floor(i)或(int)i比较不会导致死循环
        printf("%.1f\n", i);
    return 0;
}

数据结构

  • 每个进程/线程的栈空间大小是有限的,而局部变量的内存是在栈上分配的,如果局部变量过大,则会出现分配失败的情况。所以当声明数组比较大的时候,应将其声明在全局变量,或者malloc动态申请内存于堆上。

函数规则

  • 对于大量数据的读入,cin的效率不及scanf,原因是C++中cin为了和scanf保持同步, 使可以混用两种方法,不至于文件指针乱码导致发生错误,牺牲掉了一点效率。解决办法如下:

  • 定义类、结构体时重载运算符

    • 返回值为bool类型的比较符(<, >, ==, !=)
      bool operator 比较符 (const 结构体名 &b) const
      {
        return (比较成立的条件); //注意比较时主元直接使用元素名或用this->元素名;
      }
      例如:
      bool operator < (const point &b) const
      {
        return this->elem > b.elem; //对point结构体的elem降序
      }
    • 返回值为结构体类型的运算符(+, -, *, /, =)
      结构体名& operator 运算符 (结构体名& b)
      {
         //结构体内变量的计算
        return *this;
      }
      例如:
      POINT& operator + (POINT& b)
      {
        this->str += b.str;
        this->num += b.num;
        return *this;
      }
  • 一般来说,在调用的函数内对形参的修改不会导致实参发生变化,比如在C中调用自定义函数int swap(int a, int b),引入临时变量t交换a和b的值,是不会改变main函数调用时的实参的值的。解决办法:

    • 传指针,即int swap(int*a, int *b),再改变*a和*b中的值,实现真正交换。
    • 传引用(C++推荐),即int swap(int &a, int &b),实现by reference而不是by value,避免指针的问题
    • 利用现有的模板函数,如STL algorithm里的swap,兼容数据类型更强大
  • 数据量不大,且涉及空格切分的字符串时,可以利用字符串流stringstream(头文件sstream),把一行中的string作为流进行读写,比如给定一行由空格分隔的整数,求这些整数和,代码如下:

#include "iostream"
#include "string"
#include "sstream"

using namespace std;

int main(int argc, char const *argv[])
{
    string line;
    while(getline(cin, line)) //读入一行字符串
    {
        int sum = 0, x;
        stringstream ss(line); //line构造stringstream
        while (ss >> x) //流读出
            sum += x;
        cout << sum << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值