最短的可通过编译的C语言程序
要求:写一个最短的,能通过编译的C语言程序,但不要求能正确运行。
一般人首先想到的是除0。即
int main()
{
return /;
}
除0会引发SIGFPE信号(浮点异常)。
我们也可以删掉return,但是这样做的话编译器会把这句没有值的语句优化掉。那么我们就改成赋值语句:
i;
int main()
{
i = /;
}
在C89标准里,声明一个整形变量可以省略int。因此我们还可以把main函数的int类型声明也省略掉,变成
i;
main()
{
i = /;
}
不计任何空格,这段程序只有16个字符,可以说是非常短了。但是,我们还可以进一步缩短它。
当C程序在编译的时候,编译器会产生一个或更多对象文件,文件里有对于用到的库和全程对象(函数和变量)的符号索引。然后这些对象文件会进行链接,这是符号索引被地址所代替,就产生了一个可执行文件。
编译器在一个对象文件里提供了一个调用main函数的入口点。调用main函数,意味着我们试图执行存储在main函数链接的位置所对应的地址里的指令。
有趣的是,链接器对于不同对象的类型是没有概念的,它只知道它们的地址。所以,如果我们用一个常规的全程变量替换main函数,编译器会高兴地build对象文件,因为它不关心main的类型是什么;链接器也会高兴地链接它,因为它只关心main函数对应的地址。
所以,考虑这个C程序:
int main=;
这个程序会试图按函数的方式去执行main,但是这样不会奏效,因为编译器把它放到了不可访问的地址上,所以变量main实际上可以初始化为任何值。
继续省略int类型声明,我们得到:
main=;
而事实上,main在这里是个全局变量,而C语言中的全局变量都会隐式地初始化为0,因此上述语句就等价于
main;
好了,这个程序可以编译通过!虽然执行的时候一定会触发SIGSEGV信号,产生Segment fault。但这已经满足了我们一开始给出的要求了(能编译通过但不一定正确运行的最短C语言程序)。
最短的可通过编译的C语言程序的更多相关文章
- linux下怎么编译运行C语言程序?
		linux下的C语言编译器是gcc,C++的编译器是g++. linux下编程可以使用编辑器vi或vim,建议使用vim,因为它有语法高亮显示.程序编写好后,假设你的程序名为test.c,可以使用gc ... 
- cmd命令行进入DOS方式编译运行C语言程序实现字符串转换
		需求:输入一个字符串(长度小于50),然后过滤掉所有的非数字字符,得到由数字字符组成的字符串,将其转化为double型结果输出(4位小数). 源程序: #include<stdio.h>i ... 
- 如何使用emacs编写c语言程序,并编译运行
		vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ... 
- linux终端下 编译c语言程序
		linux终端下,编译C语言程序步骤为: 采用vi进行源代码编写,编写完成后,:wq存盘退出,如: vi test.c 在命令行下,运行gcc编译程序,生成执行码,如: gcc -o test te ... 
- 李洪强漫谈iOS开发[C语言-004]-开发概述程序设计语言程序编译过程
		汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中 ... 
- Atitit.dart语言的特性  编译时js语言大总结
		Atitit.dart语言的特性 编译时js语言大总结 1. 原型环境1 1.1. Dart可以编译js3 2. 第二个期待的理由是Dart的语言特性,没有什么特别特性好像,类似java c#一小时 ... 
- 09GNU C语言程序编译
		1. C 语言程序概述  GNU gcc 对 ISO 标准 C89 描述的 C 语言进行了一些扩展,其中一些扩展部分已经包括进 IOS C99 标准中.本节给出了内核中经常用到的一些 gcc 扩展语 ... 
- iOS_02_第一个C语言程序(理解编译、连接、运行)
		一.开发工具的选择 1. 可以用来写代码的工具:记事本.ULtraEdit.Vim.Xcode等. 2. 选择XCode的原因:苹果公司官方提供的开发利器.简化开发的工程.有高亮显示功能. 3. 使用 ... 
- 关于JAVA,特点,历史,编译式的语言&解释式的语言,什么是java?JDK?DOS?一次编译到处运行原理。
		1.java语言的特点: 简单的:面向对象的:跨平台(操作系统)的(一次编译,到处运行):高性能的: 2.类名的首字母大写,方法小写: 3.历史: java2(即java),为什么加个2呢?1998年 ... 
随机推荐
- plain framework 1  参考手册 入门指引之 许可协议
			许可 介绍 Apache2 License 介绍 使用非常友好的阿帕奇2许可协议,你可以应用到你想用的任何应用上,如需修改源码,请保留原作者信息. Apache2 License Apache Lic ... 
- WinCE项目应用之RM905a+活度计远程检定方法研究
			前文<RM905a+医用放射性核素活度计>中已经提到,基于WinCE5.0系统的RM905a+可以很方便的实现远程界面显示和控制.所以远程检定的主要工作在于服务器端的业务部分.基于< ... 
- USACO1.5Superprime Rid[附带关于素数算法时间测试]
			题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组 ... 
- using关键字的用法
			1.using 关键字可以用来导命名空间,与java中的import类似. 2.using关键字可以用来释放资源,并且被释放的资源代码是非托管代码. 既然可以释放非托管代码,那么什么是非托管代码? 我 ... 
- insertBefore的兼容性问题
			父级.insertBefore(新的元素,被插入的元素)方法 在指定的元素前面插入一个新元素 在ie下如果第二个参数的节点不存在,会报错 在其他浏览器下如果第二个参数不存在,则会以appendChil ... 
- C语言:关于socket的基础知识点
			/** * ---结构体--- * * #include <sys/socket.h> * struct sockaddr { * unsigned short sa_family; * ... 
- java工程中的.classpath<转载>
			第一部分:classpath是系统的环境变量,就是说JVM加载类的时候要按这个路径下去找,当然这个路径下可以有jar包,那么就是jar包里所有的class. eclipse build path是ec ... 
- String PK StringBuilder,传说就是传说,只有动手实验,才能得出确定的答案
			本机测试结果如下: 大部分情况下,string 性能并不比StringBuilder差,只有特殊情况才出现差异,并非 如前面有些朋友测试的结果哪样,只要使用StringBuilder 就一定比Stri ... 
- [转]nginx+fastcgi+c/c++搭建高性能Web框架
			FROM : http://blog.csdn.net/marising/article/details/3932938 1.Nginx 1.1.安装 Nginx 的中文维基 http://wiki. ... 
- (转)c# 解析JSON的几种办法
			来自:http://blog.csdn.net/gaofang2009/article/details/6073029 欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的 ... 
