C语言进阶:17、++和--运算符分析

++和--对应的是两头汇编指令:

    前置:变量自增(自减)1,取变量值;

    后置:取变量值,变量自增(自减)1;

观察下面代码,判断输出:

#include <stdio.h>

int main()
{   
    int i=0;
    int j=0;
    
    j = (i++) + (i++) + (i++);
    
    printf("i = %d\n", i);
    printf("j = %d\n\n", j);
    
    i=0;
    j=0;
    
    j = (++i) + (++i) + (++i);
    
    printf("i = %d\n", i);
    printf("j = %d\n", j);
	
	return 0;
}

在Linux下使用GCC进行编译运行:    

i = 3
j = 0

i = 3
j = 7

为什么会出现这种情况呢?

 查看汇编代码可发现:

    VC编译器先对i进行三次自增1,然后相加,结果为9;

    GCC编译器先对i进行两次自增,相加后再进行自增。

C语言中之规定了++和--对应指令的相对执行次序,所以++和--对应的汇编指令不一定连续执行。

在混合运算中,++和--的汇编指令可能会被打断。

所以,必须注意的是,++和--在混合运算中,结果是不确定的。在工程中应该避免这种写法。

笔试面试中的“奇葩”题:  

	1、++i+++i+++i;
	2、a+++b;

首先先了解一下“贪心算法”:含++和--表达式的阅读技巧

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

    编译器从左往右的顺序一个一个尽可能多的读入字符;

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

int main()
{   
    int i=0;
    int j = ++i+ ++i+ ++i; // int j= ++i+++i+++i;  -->>error
    
    printf("j = %d\n", j);
       
    int a=1;
    int b=4;
    int c = a+++b;
    
    int* p =&a;
    
    b = b/ *p;    //b = b/*p; -->> error

    printf("a = %d\n", a); 
    printf("b = %d\n", b);   
    printf("c = %d\n", c);
	
	return 0;
}

为了避免编译器的“贪心”,可以使用空格作为一个运算符的休止符,编译器在读入空格之后会立即对之前读入的符号进行处理。所以在日常的代码编写中,建议可以加空格的地方不要省略,增强程序的可读性。

需要注意的是:

    int a = 1;
    int b = 2;

    int m = ((a++) < (b) ? (a++) : (b));

程序运行后,m=2, a=3。不会发生短路。

小结:

    ++和--操作符在混合运算中的行为可能不同。

    编译器通过贪心算法处理表达式中的子表达式;

    空格可以作为C语言中的一个完整符号的休止符;

    编译器读入空格之后立即对之前的符号进行处理。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言是一种开源的编程语言,由Google公司开发并在2009年发布,其设计目标是提供一种简洁、高效、并发的编程语言,适用于构建大规模的分布式系统和网络应用。 Go语言的基础包括变量、数据类型、运算符、循环、条件语句等,它具有类似C语言的语法结构,但是更加简洁易懂,容易上手。同时,Go语言还提供了丰富的标准库,包括网络、并发、文件操作等功能,可以满足日常开发的基本需求。 在Go语言的进阶部分,学习者可以深入了解Go语言的并发编程模型。Go语言通过goroutine和channel两个关键特性来实现并发编程,goroutine类似于线程,但是比线程更加轻量级和高效,channel则是用于goroutine之间的通信。这种并发编程模型的设计使得开发者可以方便地编写高效的并发程序,从而提升系统的性能和可伸缩性。 就业方面,掌握Go语言可以为就业创造更多的机会。随着云计算和大数据技术的不断发展,对于高性能、分布式、高并发的编程语言的需求也越来越大。而Go语言作为一种专注于构建高性能网络服务的语言,正在受到越来越多公司的青睐。因此,具备熟练的Go语言技能,可以有更多的就业选择,并且在薪资待遇方面也有一定的优势。 总结来说,Go语言作为一种简洁、高效、并发的编程语言,具有良好的学习曲线和广泛的应用领域。通过深入学习和掌握,可以在基础、进阶和就业方面获得全面的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值