对++运算符的思考

C语言中支持++前缀运算符和++后缀运算符,但是前缀运算符的优先级高于后缀的优先级,C语言的运算符优先级共有15等级,在同一等级的运算符中的运算顺序是由结合性决定的。


优先级


运算符


名称或含义


使用形式


结合方向


说明


1


[]


数组下标


数组名[常量表达式]


左到右

 

()


圆括号


(表达式)/函数名(形参表)

 

.


成员选择(对象)


对象.成员名

 

->


成员选择(指针)


对象指针->成员名

 

2


-


负号运算符


-表达式


右到左


单目运算符


(类型)


强制类型转换


(数据类型)表达式

 

++


自增运算符


++变量名/变量名++


单目运算符


--


自减运算符


--变量名/变量名--


单目运算符


*


取值运算符


*指针变量


单目运算符


&


取地址运算符


&变量名


单目运算符


!


逻辑非运算符


!表达式


单目运算符


~


按位取反运算符


~表达式


单目运算符


sizeof


长度运算符


sizeof(表达式)

 

3


/



表达式/表达式


左到右


双目运算符


*



表达式*表达式


双目运算符


%


余数(取模)


整型表达式/整型表达式


双目运算符


4


+



表达式+表达式


左到右


双目运算符


-



表达式-表达式


双目运算符


5


<<


左移


变量<<表达式


左到右


双目运算符


>>


右移


变量>>表达式


双目运算符


6


>


大于


表达式>表达式


左到右


双目运算符


>=


大于等于


表达式>=表达式


双目运算符


<


小于


表达式<表达式


双目运算符


<=


小于等于


表达式<=表达式


双目运算符


7


==


等于


表达式==表达式


左到右


双目运算符


!=


不等于


表达式!= 表达式


双目运算符


8


&


按位与


表达式&表达式


左到右


双目运算符


9


^


按位异或


表达式^表达式


左到右


双目运算符


10


|


按位或


表达式|表达式


左到右


双目运算符


11


&&


逻辑与


表达式&&表达式


左到右


双目运算符


12


||


逻辑或


表达式||表达式


左到右


双目运算符


13


?:


条件运算符


表达式1? 表达式2: 表达式3


右到左


三目运算符


14


=


赋值运算符


变量=表达式


右到左

 

/=


除后赋值


变量/=表达式

 

*=


乘后赋值


变量*=表达式

 

%=


取模后赋值


变量%=表达式

 

+=


加后赋值


变量+=表达式

 

-=


减后赋值


变量-=表达式

 

<<=


左移后赋值


变量<<=表达式

 

>>=


右移后赋值


变量>>=表达式

 

&=


按位与后赋值


变量&=表达式

 

^=


按位异或后赋值


变量^=表达式

 

|=


按位或后赋值


变量|=表达式

 

15


,


逗号运算符


表达式,表达式,…


左到右


从左向右顺序运算

在此,需要说明一个问题:

问题1:

对于语句:

int a=4;
++(a++);

存在的问题。

根据编译原理的知识可以知道,翻译此语句是

const t1=a;
a=t1+1;
t2=t1+1;
t1=t2;

显然t1已经声明为const常量,所以再将t1赋值显然是错误的,因为t1的值不能被改变。

问题2:

int a=3, b;
b=(++a)+(++a);
printf("%d",b);

打印出来的结果是10

这个问题的正确理解:

采用编译原理的三元组翻译此段:

t1=a;
a=t1+1;
t2=a+1;
a=t2;
t3=a+a;
b=t3;

因此可以知道输出结果是10

问题3:

int a=3;
printf("%d %d",a++,a++);

这个输入的结果是

4 3

这个问题的理解涉及到计算机程序空间组织的理解了,

在参数传递的问题中,计算机总是先将后面的参数先传入数据栈中,后传递前面的参数,因此输出的结果就会是4 3了。。。

时间: 2024-11-06 09:30:46

对++运算符的思考的相关文章

c/c++ 重载运算符的思考

c/c++ 重载运算符的思考 #include <iostream> using namespace std; class Imaginary{ public: Imaginary():real(0), imag(0){ cout << "c:" << this << endl; } Imaginary(int real, int imag):real(real), imag(imag){ cout << "c:&q

C++的运算符重载--思考1

学习C++ 我们最深刻的体会就是C++不像那个C同学,是那样的单纯,我们表面上一看就透,是啥就是傻.C++中所有的东西都是为面向对象而设计的,所以不免有些黑盒之类到的思想,就是很多表面的东西,在内部是经过复杂的封装的,所以这个C++同学已经别社会污染,变得城府很深了,我们要想了解这位C++同学,就必须从他的外表之下去偷窥他内心那单纯的性格,只有这样才能看到它的内心世界! 今天我想讨论一下运算符重载,其实说白了就是一个函数重载,只是这个函数的名字有点怪而已.看这一点就可以体现出C++ 同学的城府很

PHP学习之输出语句、注释、算数运算符

今天学习了PHP的输出语句: 1.echo echo只能输出数字.字符串. 对于布尔类型 true输出1 false输出空. 可以一次输出多个参数 2.var_dump() 如果输出变量,可以输出变量的值和变量的类型. 如果输出的是数组,包括键.值.值的数据类型 3.print_r() 用来输出数组,输出的内容包括键.值,不包括数据类型. 4.print 与echo类似,输出成功返回1,否则返回0.只能一次输出一个参数. 注释: //单行注释 #单行注释 /* 多行注释 */ 算数运算符: 思考

运算符-java

Java 运算符 算术运算符 关系运算符 位运算符 算术运算符 假设int a=5;int b = 10 操作符 描述说明 示例 + 符号两侧值相加 a+b值为15 - 符号两侧值相减 b-a值为5 * 符号两侧值相乘 a*b值为50 / 符号两侧值相除 b/a值为2 % 取余 b%a余数为1 ++ 自增:增加1 a++的值为6 - - 自减:减少1 b- -的值为9 练习:算术运算符 问题思考:a++和++a有什么不同: public class selfAddMinus{ public st

思考: 对于一个要重载的运算符而言,什么样的运算符应该用类成员函数重载,什么情况应该用友元函数重载??

还是用一个例子来说明吧 1 #define unsigned int UINT32 2 3 class RMB 4 { 5 public: 6 RMB(UINT32 d, UINT32 c); 7 friend RMB operator +(RMB&, RMB&); 8 friend RMB& operator ++(RMB&); 9 void display() 10 { 11 cout<<(yuan + jf / 100.0)<<endl; 12

运算符重载的宏观思考The Complex Class

运算符重载是C++中较C语言更加先进和灵活的地方之一,通过运算符重载,使运算符拥有了除了只能完成内置类型的运算操作之外的对于其他自定义类型的运算功能.这使得C++更加灵活,通俗,更加面向对象. 事实上运算符的重载不过是对函数名为"operator 运算符"的函数的定义,根据所操作的对象的不同,可以分为成员函数和友元函数两种定义方法. C++中唯一的三目运算符不能重载,因此所有的运算符重载的形参都不会超过三个,又由于成员函数默认第一个形参必须是自定义类的对象并且默认绑定到*this指针,

es6函数的rest参数和拓展运算符(...)的解析

es6的新特性对函数的功能新增加了rest参数和...的拓展运算符.这是两个什么东西呢? 先来看一个问题:如何获取一个函数除了定义的参数之外的其他参数?传统的做法是借助函数的arguments关键字来获取的. 方法如下: function add(a,b){ var i=2,rest=[]; if(arguments.length>2){ for(i;i<arguments.length;i++){ rest.push(arguments[i]); } } return rest; } con

自增、自减运算符的前缀和后缀

试卷中有这么一道题目: 1 2 int a = 4; (++a) += i; 求a的数值,正确答案是10. 如果你认为这道题重点只是考察运算符优先级,可能很容易得到正确的答案. 但是,考虑过为什么下面的代码无法编译么? 自己在笔试时,考虑到了关于表达式作为赋值运算符左值的问题,但是自己确实又对重载"++"操作符的实现机制和函数原型不很了解,就误认为"a++"和"++a"这两种写法都不能作为赋值运算符左值,从而以为这道题出错了,或者故意考察这一点,

C/C++基础笔试题1.1.1(运算符十问)

本文似乎都是问题,意在引起思考,回忆,主题是运算符,另外这些问题是没有特别的逻辑上的关系,只是我想到的就问了,虽然是随便问,但是你能不能随便答呢?. 运算符,我们在每一个程序中都会用到,也是最最基础的基本功,本系列C/C++基础笔试题等,是没有纲要,没有规律的一系列博文. 为什么这样子,因为作者是渣阿,他只能学一点说一点,力求通俗阿,傻瓜但不失主线阿. 1.0写的是字节对齐,没看过有兴趣的朋友可以戳这里.1.1写的是与运算符相关的内容,你最"熟悉"的"朋友". 首先