这么好的书,觉得写点东西,记录一下比较好。 4.1选择编程语言。 程序员使用熟悉的编程语言生产率高于使用不熟悉的编程语言,并且高级语言比低级语言的效率要高得多,作者列出了几种高级语言的每一行代码与等效的c语言代码行数之比。比如java是2.5,而perl和python就是6.而且编程语言影响程序员的思维随处可见,作者举了个他遇到的项目,那就是一群fortran程序员去写c++,最后写出来的代码就是伪装成c++的fortran代码。 这个很有感触,自己第一个项目当时有用到c,而当时项目组里面只有一个人对c比较熟悉,可是没办法,人不够,只好上我们几个做java的,最后开发效率非常低下,而且代 ...
比如很简单的一个斐波那契数列,如果纯粹从数学上来说,那就是 引用f(n)=f(n-1)+f(n-2)当n>1时,而n=0时f(n)=0,当n=1时,f(n)=1 很容易我们就可以直接翻译为程序: (define (f n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (f (- n 1)) (f (- n 2)))))) 这就是数学公式直接翻译为程序。从数学的角度来看,这个程序很完美,和上面的数学公式一模一样。可是从计算机角度来看这个程序非常的不好,那是因为会做很多重复的计算。 自己在这里 ...
LLVM全称是 Low Level Virtual Machine 引用LLVM is a robust system, particularly well suited for developing new mid-level language-independent analyses and optimizations of all sorts, including those that require extensive interprocedural analysis. LLVM is also a great target for front-end development for ...
原文在这里: http://programming.reddit.com/info/63tnv/comments/c02qx55 Latent typing是一种你不需要在源码中的明确的声明你的变量的类型的类型系统.而与之相反的是manifest typing,它需要你在源码中明确的声明你的变量的类型。 Static typing类型系统指的是你的源码中的任何独立的表达式都必须有类型,不管它的类型是直接写在源码中,或者是通过编译器来推断.Dynamic typing是运行时的值才有类型的一种类型系统,因此在它里面程序的表达式能够有任意的类型. overlap 是一种类型推断系统 ...
这几天一直在做csapp里面的3.38,他是让你自己实现一个缓冲区溢出程序.代码如下: /* Bomb program that is solved using a buffer overflow attack */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> /* Like gets, except that characters are typed as pairs of hex digits. Nondigit characters are ignored. Stops ...
gcc对c语言中的switch的优化 在这里: http://simohayha.javaeye.com/admin/show/146825 接着用上次的代码 switch.c int switch_eg(int x) { int result = x; switch (x) { case 100: result *= 13; break; case 102: result += 10; /* Fall through */ case 103: result += 11; br ...
在c语言中switch语句会被实现为一个跳转表,跳转表是一个数组,这个数组里面存的都是地址,也就是说只要你传递给它一个i,他就会返回给你,你所需要跳转的地址,这样做得好处就是执行语句的时间和条件的个数无关..不过在gcc里面他也只是条件数大于4个,才会生成这个跳转表. 请看下面的代码: int switch_eg(int x) { int result = x; switch (x) { case 100: result *= 13; break; case 102: result += 10; /* F ...
指针是c的灵魂,俺这里只能抛砖引玉了. 1 首先,数组名不能当作赋值对象,比如下面的代码: char *s="abc"; char *s1="bcd"; s1=s; printf("%c\n",s1[0]); 可以正常运行,如果把 这边的指针变为数组就会出错。 2 下面阐述一下,指针和数组各自是如何访问的: char s[]="abc"; c=s[i]; 编译器符号表有一个符号 s 地址为 1234,然后首先取i的值,把i和1234相加,然后取出(i+1234)的内容付给c. char *s="abc"; c=s[i]; 编译器符号表有一个符号s,他的地 ...
#include <stdio.h> #define f(i) {printf("%d",i);} void main() { f(5); } 这个会打印出5; 然后紧接着修改程序; #include <stdio.h> #define printf_ex(x) printf x void main() { f(5); } 这个竟然不会出错,还会打印出5; #include <stdio.h> #define printf_ex(x) printf x void main() { f(5); printf_e ...
这个题目的英文原题是: 引用 Consider a function which, for a given whole number n, returns the number of ones required when writing out all numbers between 0 and n. For example, f(13)=6. Notice that f(1)=1. What is the next largest n such that f(n)=n? 翻译过来大体是这样: 有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。比如f(13)=6,现在 ...
simohayha
搜索本博客
存档
最新评论