the c programing language 学习过程2

时间:2021-10-06 14:28:38

manipulated 操纵  notations符号 hexadecimal十六进制 precision精度 be concatenated at 把····联系起来 enumerations枚举 long standing存在很久的 formalizing形式化 coercions强制 underscore下划线.assemblers汇编 typographically印刷 suffixed 添加后缀 truction建设binary 二元的 unary一元 negation operator 求反   considerable该注意的 flexible灵活的 implementation 实施 contiguous接触的 邻接的  inadvertently疏忽的漫不经心的  coercion强迫 conciseness 简明 succinct简洁的 nested嵌套

oprand操作数,运算数,the number on which an operation is to be done。

1这本书还是有点难度的,本来以为只是一本入门教程。首先这天杀的英语。单词能看懂七成,组合在一起只能看得懂三成了。还有这练习题,哪有第一章就这么可怕的.....还贴心的注明了 this program is hard if you do it 。看得懂看不懂 先过一遍再说

2ANSI改了不少东西 比如unsigned 浮点精度 long double 字符串在编译的时候可以背联系起来 枚举类型(只记得是干嘛的了) const锁定变量以及 变量计算直接的转换有了更丰富的类型集(?)

3使用字母和数字来做变量名 _也可以但一般不用在首位 _可以很好的提高长变量名的可读性 大小写是不同的变量 如 x和X 一般用小写作变量 大写做常量

4如果 c h a r对象占用8位,那么unsigned char变量的取值范围为0 ~ 2 5 5,而signed char变量的取值范围则为- 1 2 8 ~ 1 2 7普通c h a r对象是有符号的还是无符号的则取决于具体机器,但可打印字符总是正的。

5 如果数字太大超过int范围 也会被当做long 处理.0(zero)在前是八位数 0x或者0X是是六位数   31 =037或者0x1F或者0x1f. 0XFUL 就是一个unsigned constant的15.

6字符常量是一个整数 如‘0’的ASCII码是48,字符常量也可以参与数值运算.

7

#define VTAB '\013' /* ASCII纵向制表符 */
#define BELL '\007' /* ASCII响铃符 */
也可以用十六进制写
#define VTAB '\xb' /* ASCII纵向制表符 */
#define BELL '\x7' /* ASCII响铃符 */

8

\a 响铃符 \ \ 反斜杠
\b 回退符 \? 问号
\f 换页符 \' 单引号
\n 换行符 \" 双引号
\r 回车符 \ooo 八进制数
\t 横向制表符 \xhh 十六进制数
\v 纵向制表符

9常量表达式是含有常量的表达式 在编译时就已经计算

10"hello, " " world”  等价于 “hello, world”  这种方法可以将较长的字符串分成多个文件行

11字符串存储来看就是字符数组 最后要加 '\0‘所以字符串存储物理长度比字符数多一位  strlen就是返回字符串长度 不包括‘\0’  要区分'x'和“x” 前者是个数字 后者是字符串 里面有x和\0

12枚举常量

enum boolean { NO, YES };  NO是0 YES是1 如果还有就2 3 类推

还有一种是显示表达式 类似这样

enum escapes { BELL = '\a', BACKSPACE = '\b', TAB = '\t',
NEWLINE = '\n', VTAB = '\v', RETURN = '\r' };

enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, DEC };
/* FEB的值为2, MAR的值为3,等等。 */

不同枚举名字必须要不同,值则可以相同

13变量首要要声明 自动变量在使用前必须初始化 而且从概念上讲应该在程序开始执行之前进行 ,外部变量和静态变量缺省值为0 自动变量如果没初始化则为垃圾(未定义值)

14 const可以限定一个值不被改变 数组也可以限定 如 int strlen(const char[]);

15 %不能用于float和double 在负数计算除数和余数时候 整数截取上溢还是下溢取决于具体机器

16 + - 优先级相同 低于 * / % 低于一元的+和- 结合从左到右  关系运算> >= < <= 优先级相同 == 和!=优先级比前者低 关系运算符 优先级都低于计算优先级

如x<lim-1 等价于x<(lim-1)

17&&比||优先级高 但是都低于关系和计算运算符 当表达式从左到右测试出真假值就停止计算 比如     if( (a = 1) || (b = 2) )    最后a=1  b并没有赋值

18  ,运算符从右到左

  1. a = 1;
  2. b = 2;
  3. c = 3;
  4. printf("a = %d, b = %d, c = %d\n", a = c + b, b = a + c, c = a + b);   得出a=7;b=4;c=3

19类型转换是从窄的转成宽的 如 int 转为float才不会丢失数据 值得注意 不允许使用无用表达式 如float不能用于数组下标 long改成short float 改为int 会导致警告 但是不是非法表达式

20lower(c)将大写转成小写 非大写不变(ASCII字符集适用,EEBCDIC不适用) <ctype.h>使用了tolower作为代替 isdigit()测试是否为数字; atoi 将数字串转换成数字“123456789” 123456789

21 C语言没有指定 c h a r类型变量是无符号量还是有符号量。所以在某些机器上最左边一位是1的 机器会转换为负数 某些机器会在最左边添零保证全体是正数 为了可移植性如果要存储非字符数据则在char 前加unsigned signed

22在 if while for等等测试条件下 0为flase 非0为true

23如 + 或 * 等二元运算符的两个运算分量具有不同的类型,那么在进行运算之前先要把“低”的类型提升为“高”的类型。long double >double >float>int>long  此外 float不会自动转换成double

24赋值= 右边转换成左边类型 float转换成int 要截取小数 是用四舍五入还是截取要看具体实现

25在调用函数时如果没有函数原型则将float变为double char 和short 改为int  (类型名)变量名 可以强制转换 如(int)names;  sqrt ( (double) n) ;在传递前就转换为double了 产生一个n的新类型的值 n本身不改变7

26i++ 和 ++i 一个先用后加 一个先加后用 (u+j)++不合法  单独的nl++;和++nl;等价

27 &按位与  比如 n = n & 0177    0177二进制是1111111 就是把n最低七位以外 其他为0    0&1=0 1&1=1 0&0=0  或同理 0&1=1   按位^则 如果两个数字不同则1 否则则0  。要区分&和&& ||和| x是1 y是2 x&y 为0  x&&y 为1

28<<左移是把数字左移一定位数 x<<2 就是左移两位 即是4倍  >>unsigned则右移两位 左边空白用0填充  有符号的则用算数符号填充   ~则为求反码 0改1 1改0: 比如x= x &~077则为把最后六位改为0。

getbits(x, 4, 3)
unsigned getbits(unsigned x, int p, int n)
{
return (x >> (p+1-n) ) & ~(~ 0 << n);
}

比如111111   x >> (p+1-n)  则为001111;~0为1111111<<3  为11111000  取异00000111  然后& 则取 原来的右对齐的2 3 4位1 (从0开始计数)

29 大多数 二元运算符都有 一个 op=的形式 op可以是 + - * / % << >> & ^ |   expr1 op= expr2  等价于 expr1=( expr1) op (expr2)x*=y+1 等价于 x=x*(y+1) 不是 x=x*y+1

30if (a > b)
z = a;
else
z = b;

可以改写为

1    2   3

z= (a>b)?a:b;  如果条件非0则计算表达式2并作为条件的值 否则计算表达式3  ?优先级很低 条件可以不加括号  不过在不确定的情况下还是加一下比较好 如果表达式2 和3有不同的类型 则用之前的转换规则来办

31 C没有指定同意运算符的顺序  如x = f( ) + g( )   不同机器可能先运算f 也可能先算g  如果f改变了g中的变量(反之亦然) 则推荐先用临时变量来存储其中的一个结果来确定顺序

同样 参数的顺序也没有特别规定 比如 printf("%d %d\n", ++n, power(2,n) );  n先加还是先算power 要看具体实现而定

所以可以改成

++n;
printf("%d %d\n", n, power(2,n) );

32 关于副作用 a[i] = i++;  这个i是新值还是旧值 要看具体的编译器实现,C标准没有对此规定 因为最好的求值顺序取决于机器结构。所以我们要尽量避免着这种情况。

the c programing language 学习过程2