一、自增自减前操作与后操作的区别
在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");//这也是一个右值
注意:有些操作符,例如赋值,要求其中的一个操作数必须是左值。结果,可以使用左值的上下文比右值更广,左值出现的上下文决定左值是如何使用的。
所以,变量是左值,可以出现在赋值语句的左边,数字字面是右值,不能被赋值。