C语言中的隐式转换

为了定义转换规则,C99允许每个整数类型具有"整数转换等级"。下面按从最高级到最低级的顺序排列。

(1)long long int、usigned long long int

(2)long int、unsigned long int

(3) int 、unsigned int

(4) short int 、unsigned short int

(5) char、signed char、unsigned char

(6)_Bool

比较转换规则如下:

如果两个操作数类型相同,过程结束,否则依次尝试下面的规则:

(1):如果两个操作数都是有符号型或者都......

关于溢出的一个真实bug

来源于项目中一个真实的bug,最近项目中要适配32位linux系统时发现一段检测磁盘剩余空间的程序,低于一定空间的话退出安装程序安装失败.

代码简化如下:

参考如下代码:

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/vfs.h>

#include <errno.h>

#include <stdint.h>

#include <limits.h>

int main()

{

struct statfs d......

从一道面试题说起

如果有人问你,extern "C"的作用是什么?你会如何回答?

先说一段故事:C++创始人在编写C++的时候,C语言正盛行,他不得不让C++兼容C。C++最大的特性就是封装,继承,多态,重载。而这些特性恰恰是C语言所不具备的。至于多态,核心技术是通过虚函数表实现的,其实也就是指针。而对于重载,与C语言相比,其实就是编译方式不同而已: C++编译方式和C编译方式。对于函数调用,编译器只要知道函数的参数类型和返回值以及函数名就可以进行编译连接。extern “C”是让程序按照C的方式编译。我们先来看看C++和C两种编译方式对于究竟有何不同。

main.c

#includ......

二维数组总结

在刷leetcode时有道关于二维数组的题目,由于工作中较少写这块代码,对部分基础理解不足,现将学习C程序设计语言一书中关于二维数组的内容进行总结。

书中以一个日期转换函数为被背景问题,针对闰年与非闰年,可以写出二维数组的形式:

static char daytab[2][13]={

{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};

关于上述数组有几点需要解释:

首先将数组元素声明为char类型,是为了说明在char类型的变量中存放较小的非字符整数也是合法的。

第一个元......

结构体比较

如果有人问你能否比较两个结构体变量,你该如何回答?

在回答这个问题之前,需要了解以下知识:

什么是字节对齐?

在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。

为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”. 比如4字节的int型,其起始地址应该位于4字节的边界......

尾递归

若函数在尾位置调用自身(或是一个尾调用本身的其他函数等等),则称这种情况为尾递归。尾递归也是递归的一种特殊情形。尾递归是一种特殊的尾调用,即在尾部直接调用自身的递归函数。对尾递归的优化也是关注尾调用的主要原因。尾调用不一定是递归调用,但是尾递归特别有用,也比较容易实现。

尾递归在普通尾调用的基础上,多出了2个特征:

1.在尾部调用的是函数自身 (Self-called);

2.可通过优化,使得计算仅占用常量栈空间 (Stack Space)。

优化尾递归的分析与示例def recsum(x):

if x == 1:

return x

else:

return x + recsum(x......

gcc编译阶段

电话面试被问到一个很基础很底层的问题,可是一时间不知道如何回答,总结网上的相关内容并加以验证,如果针对文章内容有任何疑问,欢迎留言讨论。

gcc编译流程分为4个步骤,分别为:

预处理(Pre-Processing)

编译(compiling)

汇编(Assembling)

链接(Linking)

示例代码main.c

#include <stdio.h......

C语言特性C99介绍

本文将持续介绍C99中新增特性,由于工作环境在C89,因此学习C99中新增特性,本文将持续更新.

C99中的布尔值

C99提供了_Bool型,所以在这一版本中,布尔变量可以声明为_Bool flag;

除了_Bool类型的定义,C99还提供了一个新的头该头文件提供了bool宏,用来代表_Bool,同时还提供了true 和 false分别代码1和0.

示例程序:

#include <stdio.h>

int main()

{

_Bool flag = 0;

printf("%d\n",flag);

return 0;

}

输出0

#inc......

C语言宏max

在leetcode刷题LeetCode C 实现110. Balanced Binary Tree时有如下两个宏:

#define max(a,b) (((a) > (b))?(a):(b))

#define max(a,b) ((a) > (b))?(a):(b)

在编写代码时我写成了后者,在检查了代码之后提交始终失败,gdb调试时发现max这个宏存在问题。

1 + max(a, b)

相当于:

1 + ((a) > (b))?(a):(b)

考虑运算符优先级+大于?:,从右到左,因此相当于

(1 + ((a) > (b))) ? (a) : (......

标准库函数qsort使用误区

问题要从刷leetcode说起350. Intersection of Two Arrays II,在使用标准库函数qsort对数组进行排序,然后对两个已排序的数组求出其共有部分,可是提交后发现存在一个用例不过,截图如下:

完整提交代码如下:

int compare (const void * a, const void * b)

{

return ( *(int......