首页 > 编程语言 >一些 C/C++ 的知识

一些 C/C++ 的知识

时间:2023-10-14 21:55:52浏览次数:40  
标签:gcc const int str1 知识 C++ char ++ 一些

引用

https://zhuanlan.zhihu.com/p/100050970
https://www.sohu.com/a/300755552_120111838

gcc与g++的区别

GCC: GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAVA、Fortran、Pascal、Object-C等语言。
gcc是GCC中的GUN C Compiler(C编译器);g++是GCC中的GUN C++ Compiler(C++编译器)。
gcc和g++的主要区别

  1. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
  2. 对于 .c和.cpp文件,g++则统一当做cpp文件编译
  3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
  4. gcc在编译C文件时,可使用的预定义宏是比较少的
  5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏。
  6. 在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个。

C++面向对象的知识

  1. 实例化子类时,首先调用父类的构造函数,然后调用子类的构造函数;
  2. 可以从类的其他成员函数显式地调用构造函数和析构函数;例如:
#include <iostream>
using namespace std;
class Test{
public:
    Test() { cout << "Constructor is executed\n"; }
    ~Test() { cout << "Destructor is executed\n"; }
    void show() { 
        Test(); 
        this->~Test(); 
    }
};

int main(){
    Test t;
    t.show();
    return 0;
}

输出:

由于一个对象调用了析构函数,该对象就不再存在了; 如果为生命周期已结束的对象调用析构函数,则行为难以预测;
3. 构造函数可以是私有的,例如设计模式中经典的单例模式;
4. 可以从构造函数调用私有成员函数;

printf函数的格式化输出

int main(){
    int c,d;
    char strings[] = "hello";
    printf("------------------\n");
    for(c=4;c>=0;c--){
        d = c+1;
        printf("|%-1.*s|\n", d, strings);
    }
    printf("------------------\n");
    return 0;
}
```输出:
![](/i/l/?n=23&i=blog/1233571/202310/1233571-20231014213214483-503317478.png)

## 关于const char * p 和 char const * p 和 char * const p 的区别
代码:

include

using namespace std;

namespace t0
{
void test0(){
char str1[] = "Monkey";
char str2[] = "Tiger";
const char * p = NULL;

    p = str1;
    // p[0] = 'X';  //error: invalid conversion from 'const char*' to 'char' 不能修改p所指向地址的内容
    str1[0] = 'X';

    while(*p){  cout << *p << " ";  p++;        }
    cout << endl;
    
    p = str2;       // 可以修改p指向的目标
    while(*p){  cout << *p << " ";  p++;        }
    cout << endl;
}

}

namespace t1
{
void test1(){
char str1[] = "Monkey";
char str2[] = "Tiger";
char const * p = NULL;

    p = str1;
    // p[0] = 'X';  //error: invalid conversion from 'const char*' to 'char' 不能修改p所指向地址的内容
    str1[0] = 'X';

    while(*p){  cout << *p << " ";  p++;        }
    cout << endl;
    
    p = str2;       // 可以修改p指向的目标
    while(*p){  cout << *p << " ";  p++;        }
    cout << endl;
}

}

namespace t2
{
void test2(){
char str1[] = "Monkey";
char str2[] = "Tiger";
char * const p = str1;

    p[0] = 'P';     // 可以修改p所指向内存地址的内容
    cout << str1 << endl;

    // p = str2;    // error: assignment of read-only variable 'p' ,p不能指向其他内存地址
}

}

namespace t3
{
void test3(){
char str1[] = "Monkey";
char str2[] = "Tiger";
const char * const p = str1;

    // p[0] = 'P';     // error: assignment of read-only location '*(const char*)p'
    // 不可以修改p所指向内存地址的内容
    
    str1[0] = 'P';
    cout << str1 << endl;

    // p = str2;    // error: assignment of read-only variable 'p'
    // p不能指向其他内存地址
}

}

int main(int argc, char **argv){

// const char * p 和 char const * p 是一个意思 :  
t0::test0();
cout << "***********" <<endl;
t1::test1();
cout << "-----------" <<endl;
t2::test2();
cout << "+++++++++++" <<endl;

// 不允许 p 指向地址修改,也不允许修改 p 所指向地址的数据
t3::test3();

return 0;

}

效果:
![](/i/l/?n=23&i=blog/1233571/202310/1233571-20231014213918126-1366321680.png)
结论:
1. const char * p 和 char const * p 是一个意思,代表不能修改p指针所指向地址的内容,但可以修改p指针所指向的目标地址;
2. char * const p 代表不可以修改p指针所指向的目标地址,但可以修改p指针所指向地址的内容;
3. const char * const p 代表既不允许 p 指向地址修改,也不允许修改 p 所指向地址的数据;

## 函数同时有多个返回值
代码:

int x(int a, int b, int c){
int e,g,h;
e = a+b/c; // 12
g = ab+c; // 29
h = a
b*c; // 120
return (e,g,h);
}

int main(){
int a=12,b=2,c=5,d;
d = x(a,b,c);
printf("%d", d);
return 0;
}

做题遇到的,x函数返回()括起来的三个int整型数居然也不报错,但是实际返回值只有(e,g,h)中的最后一个数h。

## 持续更新

标签:gcc,const,int,str1,知识,C++,char,++,一些
From: https://www.cnblogs.com/Higgerw/p/17764805.html

相关文章

  • (待完善)C/C++ Language Standard
    C89/C90(ANSICorISOC)wasthefirststandardizedversionofthelanguage,releasedin1989and1990,respectivelyC99(ISO/IEC9899:1999)C11(ISO/IEC9899:2011)C18(ISO/IEC9899:2018)ThefirstversionofCwascalled"ASystemProgrammingLang......
  • 软考学习之UML相关知识复习
    1、六大关系复习1、泛化--即子类继承父类,在图中用extends标识2、实现--在图中用implements标识,指实现某个接口3、关联--指一个类和另一个类有关系4、聚合--弱拥有关系,即B包含于A,但是B并不属于A5、组合--是一种强拥有关系,体现了严格的整体和部分的关系6、依赖--两个类之......
  • 使用c++语言基于QT框架设计的计算器小程序
    (注:由于从未接触软件设计,后端代码也是一塌糊涂,对于一些先进的设计软件也未曾接触,如qt,vs创建MFC文件,故本次作业最大难点在于如何将已经学习的知识和未接触过的领域结合起来。秉承程序员基本素养,利用一切可以利用的资源(感谢所有开源大佬所做的贡献),如bilibili,csdn,博客园,github,......
  • C++基本算法大致总结
    排序算法:快速排序(QuickSort):使用std::sort或自定义实现。归并排序(MergeSort):自定义实现或使用std::stable_sort。堆排序(HeapSort):自定义实现或使用std::make_heap和std::sort_heap。搜索算法:二分查找(BinarySearch):使用std::binary_search或自定义实现。线性......
  • 【十分钟一个知识点】约瑟夫环问题
    问题来历据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,......
  • 盘点2023Android面试常考知识点(持续更新中.......)
    前言面试一线互联网公司的Android岗位,技术能力是首要标准。在这个互联网时代,技术更新迭代速度极快,我们需要不断学习提升自己来应对职场需求变化。在最近的面试过程中,我总结了一些中大厂面试中常考的一些核心知识点,这些知识点覆盖了Java基础、集合、多线程、虚拟机、反射、泛型、并......
  • pycharm连接远程服务器,代码成功运行,但一些基本python属性和函数会报红线(例如print)解决
    状况:pycharm连接远程服务器,代码成功运行,但一些常见python属性和方法报红线,例如print。当你在程序中输入print这种基本方法时,pycharm是不会有输入提示的,输入后也会报红线解决方法:将远程服务器中的环境变量添加至pycharm中查出服务器中环境变量:在xshell中输入vim~/.bashrc执......
  • docker细节上的一些验证
    命名空间网络命名空间文件相关容器网络1命名空间dockerpsdockerinspect〈IDorNAME〉dockerinspectivlan_test43"Pid":6338,root@vm-133:~#ls-l/proc/6338/nstotal0lrwxrwxrwx1rootroot0Oct1315:49cgroup->'cgroup:[4026532870]'lrwxrwxrwx1r......
  • 【华为OD统一考试B卷 | 100分】 报数问题 (1到3报数)(C++ Java Python javaScript)
    华为OD在线刷题平台平台涵盖了华为OD机试A卷+B卷的真题。平台的题库不断更新,确保能够涵盖华为OD机试的所有真题。点击链接注册并开始你的刷题之旅:点击立即刷题华为OD统一考试A卷+B卷新题库说明2023年5月份,华为官方已经将的2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统......
  • 抽象工厂模式--C++实现
    具体代码实现#include<iostream>usingnamespacestd;classMan{public:virtualvoidshow()=0;};classWoman{public:virtualvoidshow()=0;};classYellowMan:publicMan{public:virtualvoidshow(){cout<<"......