首页 > 后端开发 > 正文

C语言中左值和右值的区别 C语言逆向之表达式短路分析及应用

2023-06-26 19:19:27 | 我爱编程网

C语言中左值和右值的区别

C语言中左值和右值的区别

在C语言学习过程中,大家或许听到过左值和右值的概念,甚至在调试程序时编译器也会给出” left operand must be l-value ” 即左操作数必须为左值!,今天我们将为大家详细解释这两个词,以及两者的区别!

简单而言,在赋值运算符“=”左边的就是左值,在赋值运算符“=”后边的就是右值,感觉像是废话,但非常好理解。但更多时候,我们是为了学习和理解不同情况下左值和右值的区别,下面来举例依次说明,着层深入,来让大家解渴!我爱编程网

1.变量做左值和右值的区别:

如 x = 2;

这里x为整形变量,这里作为左值,代表的是一块内存单元,表示的是地址。

再如x = y;

现在看变量做右值情况,y做右值,这里呢就不在表示地址,而是代表该内存单元上的值!然后赋给x。

2.常量做左值和右值的区别:

继续 x = 2;

这里2做右值, 2是一个常量,没有任何疑问。

而如果 1 = 2;

这里我们看左值,是1是常量,这里就会有问题了,编译会报错!因为常量不可被修改、不可以被赋值!所以大家可能会听过或见过”可修改/不可修改的左值”。

3.数组名做左值和右值的区别:

例如有字符数组char a[100];

当a做右值时候,我们可以把它赋给char *类型的指针,用来指向这个数组,这种情况下数组名做右值代表该数组首元素的首地址,是常量,是完全可以的。

而数组名无论右值和还是左值,都代表是地址,是常量,因此它不可以做左值,因为常量不可被修改!所以不少同学试图再定义数组之后再试图对数组赋字符串都是错误的!

4.字符串常量做右值

字符串常量想必大家都很清楚,是用双引号括起来的字符串,既然也是常量,也理所当然不可以做左值,但做右值呢?

答案是,会表示该字符串在内存中存储位置的首地址。就就是char *  p = “dotcpp.com”;用法的原因。

 

 

以上四种,希望对大家深入理解左值和右值有帮助!大家有任何问题,请随时留言讨论!

C语言逆向之表达式短路分析及应用

C语言逆向之表达式短路分析及应用

大家在学习C语言过程中,可能会见到过一些这样的题,就是表达式短路,表达式短路主要体现在C语言中逻辑运算符&&和||。今天将对表达式短路的做逆向分析,来深入理解它。

首先利用表达式短路,我们可以写一个很经典的累加求和的函数,代码如下:

功能很简单,就是求1+2+…+99+100的数字和的一个程序,但用递归写了出来,利用逻辑与运算,左边判断是否递归到0,右边累加求和,其中的技巧巧妙的运用逻辑与运算的短路特点,实现累加的效果。请大家自行分析理解~

下面我们断点反汇编,查看重点num && (num += Add(num-1));语句的汇编代码,如下

下面详细分析:

;比较num是否为0! 这里也就是逻辑与表达式左边的判断!

0040D718       cmp         dword ptr [ebp+8],0

;判断ZF标志位是否为1然后进行跳转,到return处

0040D71C       je          Add+35h (0040d735)

;继续把num变量送入eax寄存器

0040D71E       mov         eax,dword ptr [ebp+8]

;对num减1

0040D721       sub         eax,1

;结果作为参数,压栈准备进入递归调用

0040D724       push        eax

;继续调用Add函数,地址位于0040100a处

0040D725       call        @ILT+5(_Add) (0040100a)

;栈清空

0040D72A       add         esp,4

;将num里的值放入ecx寄存器里

0040D72D       mov         ecx,dword ptr [ebp+8]

;进行累加运算

0040D730       add         ecx,eax

;放回num地址处

0040D732       mov         dword ptr [ebp+8],ecx

;此处为return num 返回Add函数结束

0040D735       mov         eax,dword ptr [ebp+8]

大家通过阅读汇编代码,上下文联系应该就可以分析出来,递归调用时候的每次参数递减,进行累加求和,正因为逻辑与运算的短路特点会先判断左边num的值是否减到了0来决定是否还算右边的表达式,汇编代码对应num为0时JE比对跳转到return处;而为假时继续计算右边表达式,进行call命令递归调用,栈地址不断变化直至0结束return返回。

大家仔细体会!

以上就是逻辑与运算中短路的特点以及运用短路来实现语句中断的例子!逻辑或原理也相同,大家可以自行实验!欢迎讨论!

更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
标签: C++
与“C语言中左值和右值的区别 C语言逆向之表达式短路分析及应用”相关推荐
刚入大学,请问计算机二级,Python,c语言,c++,编程分别是什么?
刚入大学,请问计算机二级,Python,c语言,c++,编程分别是什么?

刚入大学,请问计算机二级,Python,c语言,c++,编程分别是什么?计算机二级是一门计算机等级的考试,其中报考的科目可以有好多种,主要分为两种——office和语言,而语言又分成三个大科目——高级语言程序设计,web语言网页开发,数据库程序设计,派森跟C就是其中高级语言程序设计的科目之一。考生只需要在公布的科目里随便报考一个就可。(自行看下图)C和C++的关系,可以看成win7和

2024-02-20 02:24:02
c语言可以写java吗
c语言可以写java吗

c语言可以写java吗c语言学完可以转java吗?当然可以转,但如果说你学C语言的目标是为了初步掌握编程基础,并打算学习更高级语言做web开发,那可以考虑直接去学java。C语言是高级语言的基础,也是高级语言入门的最佳选择之一,C语言面向过程写程序按部就班自由性比较大,java基础比较简单,没有语言基础的照样能学会。在你学了C语言之后,顶多了解了C语言的思想以及某些语法。但是在java

2024-04-08 21:31:14
PHP用到的C语言中的“指针”多吗?
PHP用到的C语言中的“指针”多吗?

PHP用到的C语言中的“指针”多吗?php没有指针的概念.=============如果学习PHP的话还有没有必要学习“指针”“结构体共同体”“编译预处理”等知识点?================单从php来说,的确是用不上.但是既然都学习了前面几章,何不顺带看一下呢.即使PHP中没有指针概念,但你要理解了指针概念,对PHP的引用概念搏侍就很容易理解了.编译预算处理

2024-07-23 15:07:52
PHP与C语言的语法有什么不同
PHP与C语言的语法有什么不同

PHP与C语言的语法有什么不同PHP与C语言的语法有什么不同?PHP的基本语法和C是很相似的,可以说大部分编程语言的基本语法都是如出一辙的:顺序、选择(if)、循环(while)。不同之处有变量定义,还有实现的具体细节。但是,php主要是部署网站用的,所以大部分时候是要嵌在HTML语言里面的,并且与JS混合在一起,所以表面看上去很乱,远远没有C语言的单纯。以上是对格式方面的理

2024-09-04 16:58:18
为什么说php是c语言
为什么说php是c语言

php中的几个输出函数1echo();2print();3die();4printf();5sprintf();6print_r();7var_dump();1echo()可以同时输出多个字符串,可以多个参数,并不需要圆括号,无返回值。2print()只可以同时输出一个字符串,一个参数,需要圆括号,有返回值,当其执行失败时返flase.print的用法和C语言很像,所以会对输

2025-03-03 06:09:39
c语言可以做web开发吗?
c语言可以做web开发吗?

c语言可以做web开发吗?c语言可以做web开发的。用C语言进行web开发是非常不错的,因为C语言需要进行编译,经过编译之后,别人就看不了你的源代码,这对于保护您的知识产权是非常有积极意义的。用C语言开发web可以采用CGI的形式,可以直接接收浏览器传过来的参数进行处理,还可以做成PHP扩展的形式,编写好你自己的函数,在PHP网页里面直接调用。你还可以用C语言直接开发一个http服务

2025-03-09 11:02:49
PHP和HTML语言有什么区别
PHP和HTML语言有什么区别

PHP和HTML语言有什么区别简单的说,HTML是典型的静态网络编程用语,而PHP则是一种可实现动态的编程语言。简单举例:<?phpecho"<p>Orderprocessedat".date('H:i,jsFY')."</p>";?>在这段代码中,我们使用PHP语言中内置的函数date()来告诉客户其订单被处理的日期和时间。

2024-10-29 14:34:18
PHP中的mysqlassoc函数及其应用mysqlassoc(php程序语言?)
PHP中的mysqlassoc函数及其应用mysqlassoc(php程序语言?)

PHP中的mysqlassoc函数及其应用mysqlassocPHP中的mysql_assoc函数及其应用在PHP编程语言中,mysql_assoc函数是一个强大且广泛使用的函数。它可以使得关系数据库的管理和操作变得容易和普遍,MySQL数据库中的数据类型可以使用该函数进行转换,并且能够将数据结构使用这个函数进行组装,形成一个基于关联数组的数据结果。本文将会介绍mysql_assoc函数

2024-09-20 18:29:54