随笔分类 - C
与C语言相关的内容
摘要:(从我另一博客[Atypiape]搬家过来) 译文作者:Atypiape 原文来自:Duktape 写作日期:2016-08-12 Duktape 是一个轻量级的嵌入式 JavaScript 引擎,专注于可移植性和低占用率。 Duktape 可以被轻松地集成进一个 C/C++ 项目中:只需要将 du
阅读全文
摘要:(从我另一博客 [Atypiape] 搬家过来) 译文作者:Atypiape 原文来自:Duktape 写作日期:2016-08-13 1 参与构建 (可以通过查看入门指南,来了解更详细的介绍) Duktape 的 C 语言源文件和头文件可用于任何构建系统,只需将它们加入到你的项目中参与构建即可。可
阅读全文
摘要:项目经过长期多人的维护,所谓人多手杂,出现不少过多过长的switch-case分支,或者多重switch-case嵌套。每每添加功能,我都会紧皱眉头,然后带着罪恶感向已经成百上千行的函数里再添上一个case分支,然后纠结地收工了事。于是乎,在我的内心深处,switch-case俨然成了代码坏味道的代名词,写代码时总小心翼翼地避开它们,可往往又事与愿违。事实上,switch-case语句并不是代码坏味道的根源,坏味道来自糟糕的结构设计,过多的switch-case分支,多重switch-case嵌套,这些都将导致代码可读性下降,维护困难易出错。对于分支有多又长的switch-case分支,可是使
阅读全文
摘要:谈到优化,很多人都会直接想到汇编。难道优化只能在汇编层次吗?当然不是,C++层次一样可以作代码优化,其中有些常常是意想不到的。在C++层次进行优化,比在汇编层次优化具有更好的移植性,应该是优化中的首选做法。1 确定浮点型变量和表达式是 float 型为了让编译器产生更好的代码(比如说产生3DNow! 或SSE指令的代码),必须确定浮点型变量和表达式是 float 型的。要特别注意的是,以 "F" 或 "f" 为后缀(比如:3.14f)的浮点常量才是 float 型,否则默认是 double 型。为了避免 float 型参数自动转化为 double,请在函
阅读全文
摘要:int wsprintf( LPTSTR lpOut, // 输出缓冲区,最大为1024字节 LPCTSTR lpFmt, // 格式字符串 ...); // 需输出的参数,多少个参数都可以的,最起码前两个必须有.函数作用: 函数 wsprintf() 将一系列的字符和数值输入到缓冲区。 输出缓冲区里的的值取决于格式说明符(即"%")。 如果写入的是文字,此函数给写入的文字的末尾追加一个 '\0'。 函数的返回值是写入的长度,但不包括最后的 '\0'。我们在接触C语言的时候还接触过一个 sprintf() 的函数,用法和 wsprintf()
阅读全文
摘要:下面是我觉得比较能够体现面试官意图的代码://// 模拟 C 标准库函数 strcpy 的实现。// 百度百科词条“strcat”有详细解说.//#include <cstdlib>#include <cassert>#include <iostream>#include <exception>// C++ 中推荐的常量定义方式.const unsigned _MAX_STRING = 100;char* strcpy(char* szDest, const char* szSrc){ // 特殊情况的判断,我觉的使用断言比抛出异常好. asse
阅读全文
摘要:下面的阐述的内容只是对前辈经验的整理。由于早期计算机的内存容量很小,为了尽量节省空间,交换两变量值时不使用中间变量。但这可能暗藏着缺陷。有一个巧妙的函数 swap 是这样编写的:inline void swap(int &a, int &b){ a = a + b; //缺陷1: 可能产生上溢. b = a - b; a = a - b;}引发缺陷 1 的原因是,当 a 和 b 的值比较大,相加之和的实际值大于 int 类型所能表示的数值范围,此时产生上溢。当传入 swap 函数的实参来自同一变量时,将会引发另一个缺陷:int a = 2;// 缺陷 2: 传入同一变量, 变量
阅读全文
摘要:一个由C/C++编译的程序占用的内存分为以下几个区域:1、栈区(stack)由系统自动分配和释放,用于存放函数的参数值,局部变量值等。其在内存中是一块连续的存储区域,由低地址向高地址延伸。2、堆区(heap)由程序员分配和释放,若程序员不释放,则程序结束时可能由操作系统回收。其存储空间在内存中是不连续,分配方式类似于链表。 3、静态区(static)又称全局区,程序结束后由系统释放,用于存放全局变量和静态变量。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量则存储在相邻的另一块区域。 4、文字常量区程序结束后由系统释放,用于存储常量,字符串常量就是放在这里的。5、程
阅读全文
摘要:分配方式:栈由系统自动分配和释放,用于存放函数的参数值,局部变量值等。堆由程序员分配和释放,若程序员不释放,可能在程序结束时由操作系统回收。分配效率:栈的分配效率比堆要高得多,但堆的使用更灵活。空间大小:栈是连续的一块内存区域,其空间较小,是在编译时就确定了的,易产生栈溢出。堆的内存区域是不连续的,其空间较大。碎片问题:堆的使用容易产生碎片,使程序效率降低。而栈则不存在这个问题。
阅读全文
摘要:__int64 是有符号 64 位整数数据类型,也就是 C# 中的 long 和 SQL Server 中的 bigint,范围为 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807),存储空间占 8 字节。用于整数值可能超过 int 数据类型支持范围的情况。__int64是Microsoft自创的。要用 64 位整型的话,C 中本来就有自带long long,如下:#include <stdlib.h>#include <stdio.h>#include <limits.h
阅读全文
摘要:用过各种 C/C++ 的 IDE,有些真的让人很蛋疼。比如说用 Dev-C++(记不清是不是它了,好像VS也有这情况),编写控制台程序,调试运行,程序一执行完毕控制台窗口就闪没了,强烈考验我们的眼里。通常呢,我们会在后面加上一条具有阻塞功能的语句比如:// 版本 1// #include <conio.h>getch();// 版本 4// #include <stdlib.h>system("pause");// 版本 3// 在 C++ 中也可以是// #include <iostream>char chNothing;std::ci
阅读全文
摘要:我只是想记录一下C中可变参数列表的用法,供以后记不清了且手头上没有参考手册使用,为了方便起见我用 C++ 写了,别怪我呀。//// 可变参数列表示例 // #include <cstdlib>#include <cstdarg>#include <climits>#include <iostream>int max(int num, ...){ int m = INT_MIN; // // 参数指针 ap (argument pointer). // 用于对可变参数列表进行遍历. // va_list ap; // // 初始化参数指针 ap.
阅读全文
摘要:其实我不想废话的,但是我确实废话比较多,刚才电压突变,我的电脑自动关机了,后果,你懂的。以前一直认为 main 函数执行完毕把返回值返回给操作系统,程序自己的事情就算结束了,以后的事情就全部交给操作系统去做了。昨晚看一本 C/C++ 面试题的书,才发现,原来 main 函数执行完毕后还可以在执行其他函数。好吧,也许你要鄙视我了,知道的高手可以飘过了,不知道的朋友一起来了解一下吧,代码献上://// 如果需要在 main 函数执行结束后在执行一段代码的话, // 可以使用 atexit 函数,注册一个或多个函数,它们被注册在栈中, // 在 main 函数结束后被调用,调用顺序与注册顺序相反。
阅读全文
摘要:以前一直搞不懂,main函数返回值除了操作系统知道并处理外,对我们还有什么用,我们又怎么得到这个值。后来看了《C++ Primer》终于知道如何访问这个值,方法如下:1) 在命令行下运行一个程序;2) 在命令行下执行命令“echo %ERRORLEVEL”;这样就会输出这个程序运行结束返回值。另外,C为我们定义了两个返回值常量,EXIT_SUCCESS指代0表示程序成功的终止,EXIT_FAILURE表示不成功的终止。
阅读全文