• 词法分析器:编译器中负责将程序分解为一个一个一个符号的部分,一般称为“词法分析器”

一、=不同于==

  • C语言中赋值用一个等号的原因:
    “一般而言,赋值运算相对于比较运算出现得更加频繁,因此字符数较少的符号=就被赋予了更常用的含义——赋值操作”
    • 我的想法:这句话有点像“哈夫曼树” ,用得多自然就编码短。

测试

#include<stdio.h>

int main()
{

    int y=3;
    int x=3;
    for( ; x=y ;)
    {
        printf("%d\n",x);
        y--;
    }

    return 0;
}

输出

3
2
1

上述结果的原因:将y赋值给x,然后检查(最终被赋值的)x的值是否是0,如果是0,则跳出循环。

  • 本节的两个经验
    1、比较的时候,尽量将常量放前面,养成这样的编码习惯,比如if(0==x)
    2、不要忽略编译器的“warning”提示,有时候可能有潜在的风险。

二、&和|不同于&&和||

没有什么好补充的。

三、词法分析中的“贪心法”

重要知识点-词法解析之“贪心法”
规则:
C语言编译器将程序分解成符号(词法解析):
每个符号应该包含尽可能多的字符,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成层部分;如果可能,继续读入下一个字符,重复上述判断。

a---b;
等价于a-- -b;
和a- --b不同

证明

#include<stdio.h>

int main()
{

    int a=3;
    int b=1;
    a---b;
    printf("%d\n",a);

    int x=3;
    int y=1;
    x- --y;
    printf("%d\n",x);
    return 0;
}

输出

2
3

显然,空格对词法解析还是有一定影响。

重要经验:空格的力量

测试1(没问题的)

#include<stdio.h>

int main()
{

    int a=1;
    a<<=1;
    printf("%d\n",a);
    return 0;
}
//输出2

测试2(空格导致的词法解析-有问题的)

#include<stdio.h>

int main()
{

    int a=1;
    a<< =1;//问题所在 
    printf("%d\n",a);
    return 0;
}
//DevC++5.9.2 编译器报错:[Error] expected primary-expression before '=' token

四、整型常量

如果一个整型常量的第一个字符是数字0,那么该常量将被视作为八进制数。
然后进行词法解析的“贪心”

五、字符与字符串

用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集重点序列值。

比如,对于采用ASCII字符集的编译器而言,'a'的含义与0141(8进制)或97(10进制)严格一致

附)总结

  • 1、养成写比较的时候,尽量将常量放前面的编码习惯,比如if(0==x)
  • 2、不要忽略编译器的“warning”提示,有时候可能有潜在的风险。
  • 3、不要忽视“空格”对编译器“词法解析”的影响!!!
  • 4、注意,在分析“优先级”的问题的时候,先在脑海中先用“词法解析”出符号,然后将记忆好的“优先级”拿去使用!!!
  • 优先级记忆法:我的自建博客传送门