the First Blog in CSDN(关于C的一些认识与理解)

Hello everyone, this is Null from ZJU.

闲言少叙,来到浙大已有快一个学期了。在这期间重拾C语言,上了应晶老师的课与mooc上翁恺老师的入门课程(进阶课程正在学习ing),初步认识了指针,虽还未涉及深入的算法与数据结构,还是学到了很多很多细节与整体上的东西,有了一些自己的见解,and,AC了一些小题目。

那么,就讲讲我在这段时间都学到了什么从前未曾注意的重要的点,更重要的是新学到的知识啦。

  • 二进制(计算机)中正负数的表示:以8位二进制数为例,如十进制数 '5' 的原码是 00000101,那么,在计算机中如何表示,或者说如何存储 '-5' 呢?机智的人类想到了将原码取反加1的方式—— '5'——取反(得到反码):11111010——加1(得到补码):11111011——'-5'。值得注意的是,我们很容易发现,对一个数取补是可逆的,因此当一个数读入一个负数时,便将它的绝对值对应的二进制取反加一储存在计算机中(忽然想到,做-(-5)这样一个运算时,是不是也是通过取反加一来储存的)。那么随之产生的一个问题是:本该占据八位(bit)的数怎么保存?事实是,无法保存,要保存八位二进制数及以上的数只能通过定义更长的整型(或浮点型)或无符号数(unsigned)来实现;也就是说,8个bit实际只能保存七位二进制数,因此可表示的数值范围是{-128,...,127},对应的二进制补码编码是{10000000,...,01111111}。因此,我们可以将有符号整数的二进制的第一位看作是符号位,只要是1,就是负数,反之只要是0,就是非负数。
  • 良好的代码风格是十分重要的。我在学习过程中对曾经的写法格式作了如下改变(未必是改进):
  1. 用space缩进改为用tab键缩进
  2. 大括号的放置出现了变化,紧跟在 条件 循环 语句之后 代码更紧凑且更短
  3. '='   ','   ';'   旁加空格 更加清晰

    2.
    From                To
    
    for(;;)             for(;;){
    {                       ...; 
        ...;            }    
    }                   
    
    3.
    int a, b;
    a = 0;
    for(i=1; i<=2; i++){
    
    }
    
  • 了解了两种编程风格:Holism and Reductionism (整体与归约的思想)
  • 浮点数的输出的占位符:%f:小数形式;%e:科学计数法;%g:自动判断上述两个哪个适用并使用
  • 运算符与优先级:the First Blog in CSDN(关于C的一些认识与理解)_第1张图片
  • 几个特殊运算符的用法:
  1. "?:"条件运算符 : n = a>b?a:b;(则n为其中大的那个数)注意:这个运算符自右向左计算
  2. "<<"and">>"移位运算符:左移3<<2:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。相当于*2,注意向上与向下溢出的情况=>正负号转变。右移3>>2:按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。=>算数移位(与符号相关)
  3. ","逗号运算符:其表达式的值为后一个
  4. "&" "^" "|" "~" 四种位运算符:分别是:与;异或;或;位的取反

字符的输入与输出:

1.行响应(输入完一行后敲回车才有输出)
char ch;
while((ch = getchar()) != EOF)  //EOF: End Of File <=> Ctrl Z
    putchar();

2.字符响应(输入一个字符响应一次,常用于游戏如方向键等)
#include  //con:显示器 io:input & output

while(1){
    ch = getche();
    if(ch == ".") break;
    putchar(ch);
}  =>逐个字符打印

while(1){
    ch = getch();
    if(ch == '.') break;
    putchar('*');
}  =>不管输入什么字符都输出'*' (也是字符响应)
  • 逻辑运算符的德摩根律
  • 函数的应用:(*)编程例子:输入年份,打印日历
  • 一道编程例题
    /*
        作业题三 中翁恺老师出的一道题
        今天(2018.11.23)应晶老师的讨论课中也讲到了这题 
            给了我很多启发
      7-10 单词长度 (10 分)
        你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。
        这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。
        注意,行中可能出现连续的空格;最后的.不计算在内。
    
        输入格式:
        输入在一行中给出一行文本,以.结束
    
        提示:用scanf("%c",...);来读入一个字符,直到读到.为止。
    
        输出格式:
        在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
    
        输入样例:
        It's great to see you here.
        输出样例:
        4 5 2 3 3 4
    */
    
    //我的原代码如下
    
    #include
    #include
    
    int main()
    {
    	char c, lastcha;
    	int count=0;
    	int cnt=0;
    	int a[50000]={0};
    	int k=0;
    	while(scanf("%c", &c)){
    		if(c=='.')break;
    		if(c!=' ')
    		{	count++;k++;}
    		else if(lastcha !=' '&&k!=0){
    			a[cnt++] = count;
    			count = 0;
    		}
    		lastcha = c;
    	}
    	if(lastcha!=' '&&c == '.')
    		a[cnt++] = count;
    	int i;
    	if(k!=0){
    		for(i = 0;i
    终于到了末尾,这大概是我目前能想到的这半学期学的所有重要的东西了,可能还有一些遗漏,若想到会及时补充。然后就是期末大作业啦。为自己夹有qaq

你可能感兴趣的:(C)