小话c语言
文章平均质量分 63
从现象出发,略微深入到内部原理
程序员小迷
从前有只猫,它不去抓老鼠,而是想吃面包店的面包,最终它变成了人.
展开
-
int类型的长度为什么不统一?int类型和硬件寄存器有多统一?数据类型长度是编译器决定的?
以C语言为例,它为了支持不同硬件平台,在计算机早期,硬件资源包括内存资源非常紧张,C语言标准不能直接规定int类型就是16位或者32位,这样会造成其它平台不能运行。故,标准做了取舍,不规定int类型的确切长度,但规定了与它相关的整型类型长度的大小关系,以此既支持不同平台,又避免不同平台带来类型长度出现long比int还小的混乱。但,不得不说,在不同平台、不同编译器下,C语言类型长度产生的问题一直存在。原创 2024-10-31 18:22:57 · 450 阅读 · 0 评论 -
如何看待C语言整数求绝对值有三套API?system函数的作用是什么?如何看待表示日期和时间的国际标准ISO 8601?数值转换成字符串itoa不是C标准?
C语言不支持函数重载,整数类型有int/long/long long, 不能用同一个函数名abs, 故有abs/labs/llabs三个API. 对于支持函数重载的语言而言,只需要一个API名称即可。原创 2024-10-27 10:15:54 · 186 阅读 · 0 评论 -
为什么C语言是可移植性语言?如何理解C语言的未定义行为?C语言有哪些标准?abort和exit退出程序有什么不同?
C语言自由灵活,未定义行为其实是标准对实现的放宽,即,一种行为如果可能产生错误,那标准不必要规定会有什么错,是内存泄漏、程序终止或者其他诡异的行为,只需要提示此行为未定义,具体交给实现。这种做法是标准甩锅的行为,也是标准很理性的行为。更加安全的编程语言,如Java/C#都尽可能规避未定义行为,因为异常将会在预期中抛出。原创 2024-10-26 10:17:32 · 572 阅读 · 0 评论 -
语言的指针
如果数学是科学的皇冠,那么指针就是C语言的皇冠。指针在底层系统语言作用卓越,语言越高级越会远离指针,毕竟指针出错可能万劫不复,程序员再小心毕竟也是人。原创 2024-10-11 10:42:24 · 505 阅读 · 0 评论 -
逗号运算符
逗号运算符为了减少多条语句多行的困扰,放在一行,简洁直观,又称"顺序求值运算符"。原创 2024-09-23 19:27:35 · 400 阅读 · 0 评论 -
万恶的goto关键字
提到goto, 大家一定能想到迪杰斯特拉发表的著名论文goto有害论(Go To Statement Considered Harmful)。正是它推动了结构化程序设计语言的发展。公正地说,goto并非那么可怕,机器码/汇编码本身支持跳转,就是goto的底层形态。计算机程序中条件选择、循环等语句最终依然依靠跳转指令完成,只是高级编程语言不建议用goto, 会造成程序员的困扰。但,机器从来都没困扰过,CPU根据jmp或j*指令的地址改写RIP地址并执行,丝滑无比,从未抱怨过。原创 2024-09-23 19:26:01 · 506 阅读 · 0 评论 -
安全API
提到安全,大部分在学习和调试编程语言时并不太在意,真正爆发问题是在用户端。真正的安全漏洞是很可怕的,获取系统最高权限,获得敏感资讯,伤心不已,泪流满面。原创 2024-09-11 21:04:54 · 647 阅读 · 0 评论 -
运算符重载
C++玩运算符重载很花,一些高级编程语言都支持重载,简洁清晰有效。原创 2024-09-08 10:22:54 · 336 阅读 · 0 评论 -
语言中的内联
爸爸为了培养孩子的独立能力,会把任务交给孩子并观察孩子做的结果。但有的时候,妈妈看到孩子因为完不成而伤心难过时,会毫不犹豫二话不说帮孩子的事情做掉。这也是内联。原创 2024-09-07 11:35:05 · 338 阅读 · 0 评论 -
编译器和语言标准
编译器随着编程语言新标准而不断更新,历史的长河可能会淹没很多故事,但必要的时候,回忆起编译器版本和编程语言标准,不失一件有趣的事情。微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。助您在编程路上越走越好!原创 2024-09-04 19:21:15 · 631 阅读 · 0 评论 -
C语言问答进阶--6、函数(1)
A:现在我们将研究函数这个概念。其实这个概念很简单,和中学的时候学的y=f(x)来对照着看,对于一个参数x,会得到一个值y,就会发现它和C中的函数是一个道理。只是C函数中可以包含不传入任何参数的函数。A:函数可以被分为两大类:一类是库函数,一类是用户自定义函数。库函数包含了一些程序所需要的基本的需求,库函数毕竟不需要程序员再写了,减少了程序开发的难度和复杂度。Q:以前的pr原创 2024-08-13 19:31:16 · 1265 阅读 · 0 评论 -
C语言问答进阶--5、基本表达式和基本语句
赋值表达式表达式是什么?表达式是由运算符和操作数组成的式子。如下的代码#include"iostream.h"intmain(){inta=1,b=2,sum;coutreturn0;}那么如下的呢?#include"iostream.h"intmain(){inta=1,b=2;c原创 2024-08-13 19:30:01 · 1585 阅读 · 1 评论 -
C语言问答进阶--4、基本运算符
赋值运算符A:下面将介绍赋值操作符。它的符号就是=.A:赋值操作符,就是把一个值赋值给左边的变量。正如以前说的形如a=1之类的表达就是赋值运算符的具体应用。也许有的人在编写代码的时候写过这种代码:#include"iostream.h"intmain(){intx;1=x;coutreturn原创 2024-08-12 19:26:21 · 1199 阅读 · 0 评论 -
C语言问答进阶--3、基本数据类型
前面介绍了基本的整型变量和基本的输入输出函数,现在将进一步介绍其它基本变量类型和更多的基本函数。常量Q:可以直接输出常量吗?A:当然可以。#include"iostream.h"intmain(){coutreturn0;}Q:包含的头文件#include"iostream.h"我看和以前不一样了,它们有什么区别?A:你观察地很仔原创 2024-08-11 11:43:38 · 2046 阅读 · 2 评论 -
C语言问答进阶--2、C语言简介及基本的输入输出函数
C语言简介Q:您好,能大体介绍下C语言吗?A:当然可以。C语言是一种计算机语言,它主要被用在系统编程里,可以说,C语言的产生就和操作系统的编写密不可分。【C语言简要历史】1978年由美国电话电报公司(AT&T)的贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchie合著了著名的“THECPROGRAMMINGLANGUAGE”一书。通常简原创 2024-08-10 11:54:51 · 2718 阅读 · 0 评论 -
C语言预处理
预处理,顾名思义,预先处理,pre-process, 它是源代码被送入编译器前的第一道手续。看个简单的例子:#include <stdio.h>#define N 10int main(){ printf("%d\n", N); return 0;}VC6使用预处理指令/P得到预处理的结果:cl /P define.pre define.cdefine.pre如下:int main(){ printf("%d\n", 10); retur.原创 2024-08-05 19:52:05 · 475 阅读 · 0 评论 -
C语言primitive
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。助您在编程路上越走越好!原创 2024-08-05 19:50:40 · 1086 阅读 · 0 评论 -
printf内幕----编程内幕(1)
printf内部究竟做了什么?原创 2024-06-30 12:29:09 · 2247 阅读 · 1 评论 -
abs(-2147483648) == 2147483648?
所以,-2147483647 == 0x80000000 ----> 求补得到0x80000000.negl是求补指令,用零减去操作数,然后结果返回操作数。也可以表达成:将操作数按位取反后加1.从数学意义上,这是对的。我们从source code中一一解开.原创 2024-05-23 19:10:58 · 534 阅读 · 0 评论 -
获取执行时间的宏
你可能注意到了,这里用的变量名很奇怪, ___xxx_xiyi_eyu_maomao, 这是为了避免和之前使用的局部变量重复,导致在宏中间误使用了局部变量。微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。助您在编程路上越走越好!原创 2024-05-20 20:01:55 · 1714 阅读 · 0 评论 -
不同数据类型的内部秘密----编程内幕(2)
可以看到shll左移%cl: 0x20即32位. 有一部分书籍说,左移语句对于超过数据大小比特长度会采用模比特长度的方式得到最终左移的位数,并认为这是编译器的行为. 其实不然,这是指令集的行为.此时,证明了char被提升为int.原创 2024-05-12 12:06:55 · 500 阅读 · 1 评论 -
写自己的c库----小话c语言(19)
作者:陈曦日期:环境:[Mac 10.7.1 Lion Intel-based x64 gcc4.2.1 xcode4.2]转载请注明出处Q:对于c代码,经常可能被c++代码使用,所以经常需要使用extern "C"语句,老是写这段代码真是很烦人,有什么好的方法?A:对于重复代码来说,宏无疑是个很好的方法。#if defined(__cplusplus)#d原创 2024-05-02 14:39:19 · 65 阅读 · 1 评论 -
c语言,有时莫名,有时奇妙----小话c语言(25)
作者:陈曦 日期:2012-8-17 12:53:12环境:[Mac 10.7.1 Lion Intel i3 支持64位指令 gcc4.2.1 xcode4.2] 转载请注明出处Q1: 为什么下面的输出不按照代码的顺序显示?#include #include int main(int argc, char **argv){ while(1)原创 2012-08-17 12:49:58 · 3631 阅读 · 6 评论 -
预处理,它有时很神奇----小话c语言(24)
作者:陈曦日期:2012-7-28 18:19:55环境:[Mac 10.7.1 Lion Intel i3 支持64位指令 gcc4.2.1 xcode4.2] 转载请注明出处Q1: 宏这个东西真是很奇怪,为什么我想将一句#include代码用宏来替换,却不行?#define INCLUDE_STDIO #includeINCLUDE_原创 2012-07-28 18:16:05 · 3725 阅读 · 0 评论 -
可变参数, 它依赖于堆栈----小话c语言(23)
作者:陈曦日期:2012-7-28 12:20:17 环境:[Mac 10.7.1 Lion Intel i3 支持64位指令 gcc4.2.1 xcode4.2] 转载请注明出处Q1: 可变参数的函数调用能够被正确执行的本质原因是什么?A: 可变参数的一个重要特点就是参数个数不确定,但是最终可以被正确执行一般需要堆栈以及参数类型的确定性支持。如果参数类型都无法确定是原创 2012-07-28 12:16:35 · 6573 阅读 · 8 评论 -
可执行文件内部的秘密----小话c语言(22)
作者:陈曦日期:2012-6-23 14:24:27环境:[Mac 10.7.1 Lion Intel i3 支持64位指令 gcc4.2.1 xcode4.2] 转载请注明出处Q1: 编译生成的可执行文件内部是如何被执行的?A: 当然,首先需要知道它的结构。先编写一个简单的程序,保存为testForC.c:#include #include #原创 2012-06-23 14:21:12 · 4834 阅读 · 0 评论 -
词法分析,让状态机旋转地更猛烈些吧----小话c语言(21)
作者:陈曦日期:2012-6-16 10:21:31环境:[Mac 10.7.1 Lion Intel-based x64 gcc4.2.1 xcode4.2] 转载请注明出处Q:对于编译过程的词法分析,到底应该使用什么方式?A:可以肯定的是,必然要对需要处理的数据挨个字符判断,然后在恰当的位置截断,得到一个个的token.Q:为什么得挨个字符都判断原创 2012-06-16 10:19:45 · 7779 阅读 · 7 评论 -
要理解解释器,做一个小解释器----小话c语言(20)
作者:陈曦日期:2012-6-12 11:31:12环境:[Mac 10.7.1 Lion Intel-based x64 gcc4.2.1 xcode4.2] 转载请注明出处Q:解释器来源于什么?A:如果说是广义的解释器,那么可以把它理解成翻译器,只要能将一种被看成原始的东西翻译成需要的东西,处理的东西就可以被称为解释器。从编程语言角度,解释器更多原创 2012-06-12 11:31:46 · 8472 阅读 · 11 评论 -
汇编和c只有一步之近----小话c语言(19)
作者:陈曦日期:2012-6-8 10:50:13环境:[Ubuntu 11.04 Intel-based x64 gcc4.5.2 CodeBlocks10.05 AT&T汇编 Intel汇编] 转载请注明出处Q: 举个例子吧。A: 下面的代码的目标是计算1+2的值,最后放到变量temp中,并输出:#include #include #define原创 2012-06-08 10:48:04 · 17249 阅读 · 16 评论 -
c库(下)----小话c语言(18)
[Mac 10.7.1 Lion Intel-based x64 gcc4.2.1 xcode4.2 ]Q: 如何解决abs函数传入一个整形数最小值返回溢出的数?#include #include #include #include #define PRINT_D(intValue) printf(#intValue" is %d\n", (in原创 2012-06-02 15:49:08 · 3301 阅读 · 1 评论 -
c库(上)----小话c语言(17)
[Win7 vs2010]Q: C库和系统api之间是什么关系?A: 如下图,简单示意:可以看出,C库一部分是使用系统api实现自身功能(比如文件操作),另一部分并不会直接依赖系统api,单独实现功能(比如字符串处理)。另外,对于驱动模块,按照不同的理解,也可以放入操作系统内部或者操作系统下层;如果把操作系统看成隐形的CPU和内存的驱动,那么它也可以看成和常规意义的硬原创 2012-05-29 16:51:56 · 2548 阅读 · 0 评论 -
开发实用命令和工具----小话c语言(16)
[Mac 10.7.1 Lion Intel-based x64 gcc4.2.1]Q: 有的时候,记得在某个目录下写过某个变量或者其它什么文本形式的东西,但是后来忘记写在哪个文件里了,怎么找到?A: 这个就需要用到grep命令了。它很强大,尤其对于开发或者寻找某个东西在哪里的时候。举个例子,有个目录里面有一些文件:而且,有一些文件里面含有main字符串,现在需要把原创 2012-05-25 12:47:26 · 5113 阅读 · 0 评论 -
gdb调试命令----小话c语言(15)
[Mac-10.7.1 Lion Intel-based x64 gcc4.2.1 GNU gdb 6.3.50-20050815 (Apple version gdb-1708)]Q: 给个简单的代码,然后进入调试状态。A: 如下代码,保存为hello.c:#include int main(){ int i = 2; printf("%d\n原创 2012-05-22 11:08:25 · 3867 阅读 · 2 评论 -
gcc编译命令----小话c语言(14)
[Mac 10.7.1 Lion Intel-based x64 gcc 4.2.1]Q: 如何让编译的文件可以被gdb调试?A: 可以加入-g参数。如下代码,保存为hello.c: #include int main(){ printf("hello world!\n"); return 0;}编译 gcc hello.c -o he原创 2012-05-19 22:23:14 · 5842 阅读 · 0 评论 -
多线程,它是让计算机更好用的东西,也是程序员最容易犯错的东西----小话c语言(13)
[Mac-10.7.1 Lion Intel-based x64 gcc4.2.1]Q: c标准中包含线程操作么?A: 没有。Q: 给个mac下线程操作的例子吧。A: 创建线程的函数可以实用pthread_create, 原型如下:int pthread_create(pthread_t *restrict thread, cons原创 2012-05-19 15:43:05 · 2197 阅读 · 5 评论 -
异常处理,保证代码稳定的必经之步----小话c语言(12)
[Mac 10.7.1 Lion Intel-based x64 gcc4.2.1]Q: c语言的异常处理可以使用什么?A: 可以使用setjmp和longjmp的组合。一个是保存处理异常前执行的环境,一个是调回原来执行的环境。int setjmp(jmp_buf env);参数env的类型jmp_buf定义如下:/* * _JBLEN is numb原创 2012-05-18 15:15:02 · 2537 阅读 · 0 评论 -
结构体,面向对象的基础----小话c语言(11)
[Mac-10.7.1 Lion Intel-based x64 gcc4.2.1]Q: 结构体的本质是什么?A: 结构体就像一种粘合剂,将事物之间的关系很好地组合在了一起。Q: 结构体对象中各个变量的内存存储位置和内置基本类型变量的存储有什么区别?A: 简单地说,它们没区别;复杂地说,它们有区别。简单在于它们终究会存储在内存中,复杂地说它们的位置可能有一些原创 2012-05-18 11:04:43 · 2194 阅读 · 1 评论 -
递归,到处都是递归----小话c语言(10)
[Mac 10.7.1 Lion Intel-based x64 gcc4.2.1]Q: 递归的本质是什么?A: 递归能够运行,在于宇宙万物之间的联系和计算机最终指令的完备性。换句话说,如果一个公式的参数不能和参数相关的公式有联系,那么递归对它无解。Q: 举些例子说明递归的无处不在吧。A: 比如需要计算一个数组中最大的数值。int find_max(原创 2012-05-17 11:48:32 · 4426 阅读 · 1 评论 -
函数,它们的分工和人类的分工没什么不同----小话c语言(9)
[Mac-10.7.1 Lion Intel-based x64 gcc4.2.1]Q: 对于ctype.h中的isspace和isblank函数,一直没怎么分清楚,到底它们的不同在哪里?A: 我们做个测试:#include #include int main(){ int i; for(i = 0; i < 128; ++i) {原创 2012-05-16 17:49:49 · 2540 阅读 · 2 评论 -
运算符,一种特殊的标识符----小话c语言(8)
[Mac-10.7.1 Lion Intel-based gcc 4.2.1]Q: 可以把运算符看成特殊的标识符么?A: 是的。例如 >= 运算符两个字符之间不能含有空格,这和标识符是类似的。#include int main(){ 1 > = 2; return 0;}编译:可以看到,> 和 = 符号中间的空格导致了编译器不能理解。原创 2012-05-15 11:01:48 · 2987 阅读 · 1 评论