【总结】自增自减操作以及左右值的区别

一、自增自减前操作与后操作的区别

在c/c++中,自增(++)自减(--)操作符为数据对象加1和减1操作提供了一种方便简洁的实现方式。他们都有前置和后置两种形式。下面给出简单的代码实现:

#include<stdio.h>
int main()
{
//i++
	  int i = 1;
	  int tmp;
	  tmp = i;
	  i = i + 1;
	  //return tmp;
	  printf("%d,%d", tmp,i);
	    system("pause");

//++i
	  int i = 1;
	  int tmp;
	  i = i + 1;
	  tmp = i;
	  printf("%d %d", tmp, i);
	  system("pause");
	  return 0;


	//  
	  int i = 0, j;
	  j = ++i;//前置自增操作,结果 i=1;j=1;
	  j = i++;//后置自增操作,结果 i=2;j=1;
	  printf("%d %d", i, j);
	  system("pause");
}

    所以,从上面的代码中可以看出:前自增自减操作优先级大于赋值运算符(=),而后置自增自减操作的优先级小于赋值运算符,后自增自减操作后表达式的值不会发生改变。

小小笔试题:

//i++与++i之间的运算:
#include<stdio.h>
int main()
{
	int i = 1;
	int j = (++i) + (++i) + (++i);
	printf("%d", j);
	system("pause");
	return 0;
}

上面的这段代码你认为结果是多少呢?

没有结果,因为不同的编译器做出来的结果是不同的,我用vs2015和gcc出来的结果是不一样的,如下图所示:

vs下运行结果:


Linux下面gcc的结果:

                     


二、指针自增自减有何不同

指针的自增自减是将指针所指的地址加1或减1的操作。也有前置后置两种形式:

下面给出一段代码:

//指针的自增自减操作
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
	char str[] = "hello bit";//定义数组
	char *p = &str[0];//定义指向数组向第一个元素的指针
	char *tmp = &str[1];//定义指向数组第二个元素的指针
	printf("p = %p\n", p);
	printf("*p = %c\n", *p);
	++*p++;        //自增运算
	printf("p = %p\n", p);
	printf("*p = %c\n", *p);
	puts(str);
	_getch();
     system("pause");
	return 0;
}

运行结果:


       所以,变量的自增自减是修改变量的值。指针的自增自减是修改指针的指向地址。


三、什么是左值和右值

      左值可以出现在赋值语句的左边或右边,也就是说左值可以当右值使用。右值只能出现在赋值的右边,不能出现在赋值语句的左边。变量是左值,因此可以出现在赋值语句的左边。数字字面值是右值,因此不能赋值。在实际上,左值是一块内存存储数据要操作的地址。而右值是一个具体的数字或数据也就是该内存存储的数据内容。

示例代码如下:

int a = 1;//变量a是一个左值
char str[] = "hello bit";//数组成员str[i]是左值
"hello bit";//这个表达式是一个数据内容,它是一个右值
str("hello bit");//这也是一个右值

  注意:有些操作符,例如赋值,要求其中的一个操作数必须是左值。结果,可以使用左值的上下文比右值更广,左值出现的上下文决定左值是如何使用的。

所以,变量是左值,可以出现在赋值语句的左边,数字字面是右值,不能被赋值。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值