C语言-第13课

第13课 - ++,--操作符使用分析

 

  1. 示例

#include<stdio.h>

int main()

{

int k;

int i = 3;

k = (++i) + (++i) + (++i);

printf("%d ",k);

}

我们看到这个程序,一般会以为,这个结果应该是15。但是编译器对这个处理和我们的想法是不一样的。

一种编译器会显示18,这是因为,编译器会认为在做加法之前,进行了三次的加一运算,也就是每个结果都是6,三个6相加,结果是18

第二种编译器,会认为这三个加法运算是平等的,先算前两个加,和上面的分析一样,变成了55,再加(++i),最后的结果是16

gcc的结果是16g++的结果是16

我们看到这样的程序,就要思考,我们究竟有没有必要这样写,当然没有。对于面试中,若是出现这样的题型,我们也可以说,不同的编译器有不同的思考。

 

  1. 逗号表达式

#include<stdio.h>

int main()

{

int x;

int i = 3;

x = (++i, i++, i+10);

printf("%d ",x);

}

运行结果:15

逗号表达式,是从左到右顺序求值,最后一个表达式的值,就是逗号表达式的值。

 

  1. 贪心法

(1) 编译器处理的每个符号应该尽可能多的包含字符。

(2) 编译器以从左向右的顺序一个一个尽可能多的读入字符。

(3) 当即将读入的字符不可能和已读入的字符组成合法符号为止。

#include <stdio.h>

int main()

{   

    int i = 0;

//  int j = ++i+++i+++i;

//  编译器在读到++i++的时候就已经出错了,++i的值是2,2++就会出错。

    int a = 1;

    int b = 2;

    int c = a+++b; //c = a++ +b;

printf("%d,%d ",c,a);  //c=3, a=2

    int* p = &a;

//  b = b/*p;

//  贪心法会认为/*是一个注释符,改成b = b/ *p;

    return 0;

}

 

 

 

原文地址:https://www.cnblogs.com/free-1122/p/9706883.html