C/C++
要回杭州的李同学
这个作者很懒,什么都没留下…
展开
-
链表排序问题
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next.原创 2021-12-26 16:58:23 · 621 阅读 · 0 评论 -
二分查找算法
二分查找基础普通解法int BinarySearch(int *array, int size, int value) { int low = 0, high = size - 1; while (low <= high) { int mid = low + ((high - low) >> 1); if (array[mid] == value) { return mid; } else if (array[mid] < value) { lo原创 2021-12-23 19:16:59 · 178 阅读 · 0 评论 -
基础排序算法
#include <iostream>#include <algorithm>using namespace std;void print(int *array, int size) { for(int i = 0; i < size - 1; i++) { cout << array[i] << " "; } cout << array[size - 1] << endl;}void BubbleSor.原创 2021-12-22 23:52:58 · 325 阅读 · 0 评论 -
C++运算符重载
C++一个很有意思的特性就是除了支持函数重载外还支持运算符重载,原因就是在C++看来运算符也是一个函数。比如一个 a + b 的加法表达式也可以用函数的形式:operator + (a, b)来表达。这里的operator +代表的就是加法函数。高级语言中的表达式和数学表达式非常相似,在一定的程度上通过运算符来描述表达式会比通过函数来描述表达式更加利于理解和阅读。一般情况下在重载某个运算符时最好要和运算符本身的功能相似,当然你也可以实现一个和运算符本身无关甚至相反的功能(比如对某个+运算符实现为相减)。运算转载 2020-12-30 22:48:02 · 891 阅读 · 0 评论 -
字节对齐
字节对齐的细节与编译器的具体实现相关,一般来说需要满足以下3个准则:结构体首地址能被其最宽基本类型成员的大小所整除; 结构体每个成员相对于结构体首地址的偏移量都是该成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节; 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最后一个成员后加上填充字节。...原创 2019-09-22 18:24:06 · 139 阅读 · 0 评论 -
运算符优先级 & 结合性
用法示例一列中,部分既可以使用左值也可以使用右值,同一写作rexp。上表中,lexp表示左值表达式,rexp表示右值表达式。关于左值和右值的区别,可以简单的认为:能取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。...原创 2019-09-17 00:15:47 · 335 阅读 · 0 评论 -
C和C++接口相互调用
在真实项目的开发过程中,可能会出现需要C和C++混合编程的情况,因此会不可避免地遇到C和C++接口相互调用的问题。然而,一个项目的编码开发需要经过预处理、编译、链接这几个阶段,通常,编译器会将.c或.cpp源文件看作是一个独立的编译单元来生成目标文件,编译完成后,链接器会将这些目标文件以及项目需要用到的其他库文件链接在一起得到一个最终的可执行文件(链接器是通过查找目标文件符号表中的符号名将各个目标...原创 2019-09-14 22:00:22 · 983 阅读 · 0 评论 -
extern "C"详解
导入最近看公司项目源码,发现每个C头文件中都包含 EXTERN_STDC_BEGIN 和 EXTERN_STDC_END 这两个宏,如:#ifndef __COMMUNICATION_H__#define __COMMUNICATION_H__#include "msg_buffer.h"EXTERN_STDC_BEGINvoid send(component *src, ...原创 2019-09-14 16:25:21 · 691 阅读 · 0 评论 -
#define与typedef
最近在看公司项目源码的时候发现很多以前没关注过的地方,其中#define和typedef就是非常典型的一处。举个例子,在使用它们创建新的类型名时,如#define BOOL int和typedef int BOOL;两者在使用时,如果声明的是两个BOOL类型的变量:BOOL a, b; 此时两者并无不同,本质上都声明了两个整型的变量a和b。然而,使用#define 和 type...原创 2019-09-14 10:56:22 · 164 阅读 · 0 评论 -
__FILE__、__LINE__、__FUNCTION__、__DATE__、__TIME__
__FILE__C/C++中的__FILE__用于指示本行语句所在源文件的文件名,举例如下:#include <iostream>using namespace std;int main(){ cout << __FILE__ << endl; return EXIT_SUCCESS;}使用g++编译运行得到的输出为:test.cpp...原创 2019-09-13 11:50:19 · 267 阅读 · 0 评论 -
空宏的作用
前段时间看公司项目源码,看到有些长相略微奇特的宏定义:#define __EFT_H__第二行里面宏定义是空的?空宏有什么作用?答案是用作标志!!!#ifndef __EFT_H__/* 代码段 */#else/* 代码段 */#endif如上面这段代码所示,空宏和普通宏定义其实是一样的,唯一的不同之处只是其定义内容为空。但是,我们可以通过判断这个宏定义是否在之前被...原创 2019-09-13 11:05:24 · 1099 阅读 · 0 评论 -
do{...} while(0)
前段时间看公司项目源码时,发现一个很有意思的地方,就是在很多宏函数定义里会出现do{...} while(0)。#define ASSERT_ARRAY_EQ(expect, actual) do { / ASSERT_EQ(sizeof(expect), sizeof(actual)); / for( size_t i = 0; i < sizeof(ex...原创 2019-09-13 10:48:51 · 211 阅读 · 0 评论