C语言学习笔记11——++ 和-- 操作符分析

++和 - - 操作符分析1:本质

在C语言中:

++ 和 - -操作符对应两条汇编指令

  1. 前置

    • 变量自增(减) 1
    • 取变量值
  2. 后置

    • 取变量值
    • 变量自增(减) 1

++和 - - 操作符分析2:C语言中的灰色地带

  1. C语言中只规定了 ++ 和 - - 对应指令的相对执行次序

  2. ++ 和 - - 对应的汇编指令不一定连续运行

  3. 在混合运算中, ++ 和 - - 的汇编指令可能被打断执行

结论: ++ 和 - - 参与混合运算结果是不确定的

/*
  测试代码
*/

#include <stdio.h> 

int main()
{
    int i = 0;
    int r = 0;

    r = (i++) + (i++) + (i++);

    printf("i = %d\n", i);
    printf("r = %d\n", r);

    r = (++i) + (++i) + (++i);

    printf("i = %d\n", i);
    printf("r = %d\n", r);

    return 0;
}

在vc编译器中运行结果

i = 3
r = 0
i = 6
r = 18

解析:r = (i++) + (i++) + (i++);
     编译器先连续 3 次取变量值相加(r = 0 + 0 + 0 = 0), 再自增 3 次。 所以 r = 0i = 3

     r = (++i) + (++i) + (++i);
     然后编译器先自增 3 次, i = 6,再连续 3 次取变量值相加(r = 6 + 6 + 6 = 18) 。所以 r = 18, i = 6

在gcc编译器中运行结果

i = 3
r = 0
i = 6
r = 16

解析:r = (i++) + (i++) + (i++);
     编译器先连续 3 次取变量值相加(r = 0 + 0 + 0 = 0), 再自增 3 次。 所以 r = 0i = 3

     r = (++i) + (++i) + (++i);
     编译器先自增 2 次, 再取 2 次值相加,在自增 1 次, 再取值相加。所以 r = (5 + 5 + 6 = 16), i = 6

++和 - - 操作符分析3:贪心法

贪心法: ++ , - - 表达式的阅读技巧

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

  2. 编译器以从左到右的顺序一个一个尽可能多的读入字符

  3. 当要读入的字符不可能和已读入的字符组成合法符号为止

/*测试代码*/

#include <stdio.h>

int i = 0;

// 解析:读入+(合法),读入++(合法),读入++i(合法),读入++i+(合法),读入++i++(合法),读入++i+++(不合法)
// 计算 ++i++ ==> 1++(语法错误) 
int j = ++i+++i+++i;         // error

int a = 1;
int b = 2;

// 解析:读入a(合法), 读入a+(合法), 读入a++(合法), 读入a+++(合法), 读入a+++b(合法), 读入a+++b;(合法)
// 计算 a+++b ==> 1 + 2 ==> 3 
int c = a+++b;        // c = 3, a = 2, b = 2

知识点:

空格可以作为C语言中一个完整符号的休止符
编译器读入空格后立即对之前读入的符号进行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值