c语言中不为人知的知识点,C语言易忘知识点(不断更新中。。。)

1、if(!flag),相当于“当flag等于0时”

因为,括号中为真时,即非零,时才执行if分支。那么前面加了“!”表示“非”,那么只有flag为零时,“!flag”才是真

2、位运算符~0,表示的是把所有的位都置为1

因为,这里的“0”是个十进制的写法,那么它是int型的,用二进制表示就是(32位机中)0000 0000 0000 0000

0000 0000 0000 0000,将他们取反,就是全部变成了1

注意:在位运算中的算法,取多少个位什么的,总是把这个些位向右移动到最后再进行处理

3、在scanf("%x", a);

在执行时输入0xaa,与输入aa是一样执行的

4、利用printf("%s{%s}[%d]:\n", __FILE__, __FUNCTION__,

__LINE__);做测试的时候用

5、关于char与int

这其实是个字符与数值之间的转化的一个问题,通常我们说char型是小整型。如下看个例子

eg:int a = 0;

char b = '0';

printf("%d,%d\n", a,

b);

printf("%c,%c\n", a,

b);

以上的实例中运行结果是:0,48

,0

解释一下,所谓小整型,可以看出来用格式化输出%d是可以打出来,但是这个值是ascii而已,其实这个数值和0似乎除了ascii码表里的关系外,无关系了

而下面用printf("%c\n", a = 0);能输出么?

答案是能的,那么它怎么工作的?如果你是int,那么它会截取最后一个字节,它会打出什么呢?当然不会按照你的想法去输出,它会按十进制的那个值在ascii表中去查找对应的值然后输出

6、在字符串的处理的时候,往往不需要用while来专门控制'\0'

因为往往字符串中的其他字符会有条件限制,而'\0'在条件之外,那么不满足就不执行它而已,这样使占用资源减少,也减少了循环与条件之间的切换

7、在字符串与数字的处理中,一定要注意差别,字符串中可能有空白,可能有‘-’,‘+’

还有在double型的转换中,如何区别对待小数点前的数和小数点后的书(参见c程序设计语言p61)

注意isspace和isdigit的调用

8、注意itoa与atoi中的符号的处理

atoi中因为是符号处理,所以用一个sign只要做个条件判断

eg:sign = (s[i] == '-') ? -1 : 1;

itoa中因为是数字怎么让这个数字值保存起来呢?(参见c语言程序设计p53)

eg:if((sign = n) < 0)

n = -n;

...

if(sign

< 0)

s[i++] = '-';

9、int的大小在位操作中十分重要,一定要注意你的赋值,很有可能,你没有赋值满却还做着对前些位上的操作

同时还要注意0x1与~0的不同和使用!

前者只表示最后一位是1,而后者表示这个类型的所有位都是1

10、printf("\c");

c不是转义字符表项中的部分,那么这个printf会出现什么状况呢?不妨自己动手试一试

结果应该是打出一个c,为什么呢?

众所周知,转义字符后面有两类:1、规定好的几种,比如?、\、'、",等等

2、还有就是8进制和16进制数,而ascii码表中的所有的数都是可以用它们的十六进制或者八进制,通过转义字符转化为对应的字符的

那么c这个字符,其实在机器中式以ASCII码表中对应的16进制存储的,那么把它转化成自己本身也就很自然了,但需要注意的是,编译器是会发出警告的

注:紧跟字符不再定义的字符中,则其行为未定义,因此以上只是一种可能性,完全由编译器决定

11、增强可读性

(1)“幻数”使用宏定义去替换,这样直观,当然宏可以替换的不仅仅只是数,它可以简单替换任何字符序列

(2)浮点数的初始化和赋值用类似0.0的形式

(3)for语句使用于初始化和步长增加都是单步的,这样代码紧凑

(4)复合性质的表达式可以某种程度上减少变量

但一定要注意不要用过于复杂的复合语句

复合语句的可行性根据的一个原则:在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式(摘自:c程序设计语言)

12、关于计数

我们往往习惯于用int型去计数,再不然就是稍加大些用long型。那么如果还不够怎么办呢?

从《c程序设计语言》中学到的,用double型。有人会问,那可怎么行?后面那么多小数啊

为什么double也可以呢?我认为,用double无非是因为不够计数了,而计数本身每次也只是累加了一个1,那么不管你使用以上哪种类型,其实都是在当做整形的或者类似处理。只是double型打出来不美观罢了

下面用一种方式将其美观起来

double countnum;

printf("%.0f\n", countnum);

这个方法可行在于%.0f规定打印出来小数部分是0个,也就是不打印小数,多好的方式

13、对于\0的理解

\是个转义字符,\0是列出的那些转义字符中的么?我要说的是,当然是,最然没有直接列出,但是给出了一个\000,是用来将8进制转化成字符用的

那么\0不就属于其中了么,而且可以很明显的指导\0对应着ASCII中的0x00,这样理解起来不禁感觉一同百通

14、注意移植性

在代码中千万不要出现“幻数”, 一定要养成这样的习惯,比如EOF就是在c库中的典型案例

由于EOF在不同机器和不同编译器中的值是不一样的,因此代码中出现EOF就很好的解决了不同机器中值不同的问题,注意深入体会

15、if——else

碰到多个判断并列的情况当然要使用if-else而不要使用多个if的情况

原因在于,使用多个if由于是并列,其实只要执行其中的一个就可以了,那么这样就造成了机器执行了不必要的代码,效率就变低了

16、注意逻辑运算中与和或的巧妙转换

if(ch == ' ' && ch ==

sh)

;

else

putchar(ch);

于一下代码对比体会

if(ch != ' ' || sh != ' ')

putchar(ch);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值