问题表达式

问题表达式



目录

  • 一. 概述
  • 二. 例题
    • 1. 例子一
    • 2. 例子二
    • 3. 例子三
    • 4. 例子四
  • 三. 分析
  • 四. 总结



一. 概述

  表达式的求值部分由操作符的优先级决定。但有时会由于编码的不规范,会导致表达式执行顺序混乱,出现问题。以下对于一些情况进行举例。


二. 例题

1. 例子一

a*b + c*d + e*f

例子一在计算的时候,由于*比+的优先级高,只能保证,*的计算是比+早,但是优先级并不
能决定第三个*比第一个+早执行。

所以表达式执行顺序可能是:((a*b) + (c*d)) + (e*f) 或者是:((a*b) + (c*d) + (e*f))


2. 例子二

c + --c

同上,操作符的优先级只能决定自减–的运算在+的运算的前面,但是我们并没有办法得
知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。

假设c为2时,表达式可能是2+1也可能是1+1


3. 例子三

int main()
{int i = 10;i = i-- - --i * ( i = -3 ) * i++ + ++i;printf("i = %d\n", i);return 0;
} 

非法表达式程序的结果:

编译器
—128Tandy 6000 Xenix 3.2
—95Think C 5.02(Macintosh)
—86IBM PowerPC AIX 3.2.5
—85Sun Sparc cc(K&C编译器)
—63gcc,HP_UX 9.0,Power C 2.0.0
4Sun Sparc acc(K&C编译器)
21Turbo C/C++ 4.5
22FreeBSD 2.1 R
30Dec Alpha OSF1 2.0
36Dec VAX/VMS
42Microsoft C 5.1

这段非法表达式在不同的编译器中,会有不同结果,这是极其危险的。


4. 例子四

#include<stdio.h>
int fun()
{static int count = 1;return ++count;
}
int main()
{int answer;answer = fun() - fun() * fun();printf("%d\n", answer);//输出多少?return 0;
}

因为count在创建的时候用static修饰过,所以每次调用后不会销毁。这时结果依然无法预测的,虽然在大多数的编译器上求得结果都是相同的。但是上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先算乘法,再算减法。函数的调用先后顺序无法通过操作符的优先级确定。

所以,可能是2-3*4也可能是4-2*3。


三. 分析

代码如下:

#include <stdio.h>
int main()
{int i = 1;int ret = (++i) + (++i) + (++i);printf("%d\n", ret);printf("%d\n", i);return 0;
}
  1. 直接f10上反汇编

在这里插入图片描述


  1. 这里的i的地址与ebp-8地址相同,所以这里的意思就是把1放到i里面。

在这里插入图片描述

在这里插入图片描述


  1. 下图第一行,将ebp-8的值放到eax中,也就是说eax现在值为1。下图第二行,将eax增加1,现在eax值为2。下图第三行,将eax的值放到ebp-8中,现在ebp-8的值是2,所以i的值是2。由此可见这三行完成的是++i。

在这里插入图片描述

此时监听到的值:

在这里插入图片描述


  1. 同上,又完成了一次++i操作。这次用到的寄存器是ecx。

在这里插入图片描述

此时监听到的值:

在这里插入图片描述


  1. 同上,又完成了一次++i操作。这次用到的寄存器是edx。

在这里插入图片描述

此时监听到的值:

在这里插入图片描述


  1. 将ebp-8的值赋给eax。

在这里插入图片描述

此时监听到的值:

在这里插入图片描述


  1. 两次加法

在这里插入图片描述

此时监听到的值:

在这里插入图片描述

在这里插入图片描述


  1. 将最后的算出的值放到ret中。

在这里插入图片描述

此时监听到的值:

在这里插入图片描述


  1. 由此可见,在vs2019编译器中的算法是4+4+4,最后得出12。此处也可对gcc编译器中算法进行一个猜测,即3+3+4。
    vs2019运行结果:

在这里插入图片描述

gcc运行结果:

在这里插入图片描述


四. 总结

  我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。



本篇博客为本人学习C语言时的详细笔记,如有错误之处,还望各位指正。
文章为原创,如要转载请注明出处

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件夹加密有哪些好处?电脑重要文件夹怎么加密?

对于每个使用电脑的人来说&#xff0c;文件夹是非常熟悉的数据管理工具。但文件夹并不具备安全保护功能&#xff0c;很容易导致数据泄露。因此&#xff0c;我们需要对文件夹进行加密。那么&#xff0c;电脑重要文件夹该怎么加密呢&#xff1f;下面我们就来一起了解一下。 文件夹…

【MAC】M2 安装docker 与 mysql

一、docker下载地址 下载地址 二、安装docker完成 罗列一下docker常用命令 # 查看docker版本 docker --version# 拉取镜像 docker pull 镜像名# 查看当前所有镜像 docker images# 查看运行中的容器 docker ps -a docker ps grep| 镜像名#镜像启动操作&#xff1a; sudo dock…

paddleocr 下载超时换源百度 ReadTimeOutError

pip install “paddleocr>2.0.1” -i https://mirror.baidu.com/pypi/simple

Axure中继器案例:中继器的repeater属性,中继器的Item属性

一.中继器的repeater属性 Repeater: 中继器的对象 visibleltemCount: 中继器项目列表中可见项的数量 ltemCount: 加载项数量 dataCount:获取中继器数据集中数据行的总数量 pageCount: 获取中继器分页的总数量&#xff0c;即能够获取分页后共有多少页 pagelndex: 获取中继器项目…

强大矢量图编辑器 Boxy SVG 激活最新

Boxy SVG for Mac功能介绍 1、干净&#xff0c;直观的UI深受Inkscape&#xff0c;Sketch和Adobe illustrator的启发 2、广泛支持画布上编辑对象几何&#xff0c;转换&#xff0c;绘画和其他属性 3、保存为SVG和SVGZ格式&#xff0c;导出为PNG&#xff0c;JPG&#xff0c;WebP和…

TypeScript 中的高级类型(联合、交叉、泛型、映射类型)

文章目录 一、联合类型&#xff08;Union Types&#xff09;二、交叉类型&#xff08;Intersection Types&#xff09;三、泛型3.1 泛型结合extends3.2 泛型结合 keyof3.3 extends keyof 和 in keyof 的区别 四、条件类型&#xff08;Conditional Types&#xff09; TypeScript…

音视频技术开发周刊 | 324

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 467亿参数MoE追平GPT-3.5&#xff01;爆火开源Mixtral模型细节首公开&#xff0c;中杯逼近GPT-4 今天&#xff0c;Mistral AI公布了Mixtral 8x7B的技术细节&#xff0c;不…

Apache Doris 在奇富科技的统一 OLAP 场景探索实践

导读&#xff1a;随着消费信贷规模快速增长&#xff0c;个人信贷市场呈现场景化、体验感强的特征&#xff0c;精准营销、精细化风险管理以及用户使用体验的优化愈发重要。作为中国卓越的由人工智能驱动的信贷科技服务平台&#xff0c;奇富科技选择将 Apache Doris 作为整体 OLA…

【离散数学】——期末刷题题库(树其一)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

城市智能图书柜需求说明书

1. 简介 1.1 项目概括 本项目主要实现智能图书柜对图书的借出、还回、续借、查询、上下架、盘点的功能&#xff0c;对于读者&#xff0c;可以进行读者证的办理&#xff0c;读者信息的录入和完善。 1.2 项目背景 ​ 目前大量读者距离图书馆较远&#xff0c;无法方便、快捷地…

IDEA运行JSP启动后页面中文乱码

源代码截图&#xff1a; 运行结果截图&#xff1a; 在<head>标签内加入代码 <% page contentType"text/html; charsetgb2312"%> 重启服务器&#xff0c;问题已改善 ————————————————— 该文仅供学习以及参考&#xff0c;可做笔记收藏…

泛型深入理解

泛型的概述 泛型&#xff1a;是JDK5中引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式&#xff1a;<数据类型>; 注意&#xff1a;泛型只能支持引用数据类型。 集合体系的全部接口和实现类都是支持泛型的使用的。 泛型的…

【功能更新】支持文档合并导出PDF/HTML格式;线上文章SEO设置能力优化

HelpLook功能更新速览&#x1f447; 文档管理能力&#xff1a; 1. 导出支持多篇文档合在一个HTML文件 2. 支持下载附件时保留原始文件名 3. 主页“推荐文章”支持添加外链 4. 文章URL根据标题自动生成 5. 文章支持添加“作者” 6. 博客模版支持置顶文章 1.导出支持多篇文…

通配符证书的优势有哪些?

在互联网安全的长河中&#xff0c;通配符证书以其独特的优势成为了许多网域管理员的首选。那么&#xff0c;它究竟有哪些魅力点呢&#xff1f;让我们从安全性、性价比和管理便捷性三个维度来解读一下。 安全性&#xff1a;标配的坚实防线 首先&#xff0c;从安全性角度来看&am…

邮件营销:定义、优势与策略指南

什么是邮件营销&#xff1f;跨境电商或者出海企业可能会经常使用它&#xff0c;它是传统的营销方式之一&#xff0c;在上世纪80年年代得以运用。 邮件营销&#xff0c;英文全称为Email Direct Marketing&#xff0c;缩写为EDM。它是指在收件人许可的情况下&#xff0c;通过电子…

前端开发新趋势:Web3、区块链和虚拟现实

目录 前言 Web3&#xff1a;下一代互联网 区块链技术 去中心化应用程序&#xff08;DApps&#xff09; 区块链&#xff1a;重塑数字世界 数字钱包 NFT&#xff08;非同质化代币&#xff09; 虚拟现实&#xff1a;沉浸式体验 WebVR和WebXR 三维图形 新挑战与机会 性…

final

final final关键字是最终的意思&#xff0c;可以修饰&#xff08;类、方法、变量&#xff09;修饰类&#xff1a;该类被称为最终类&#xff0c;特点是不能被继承了修饰方法&#xff1a;该方法被称为最终方法&#xff0c;特点是不能被重写了修饰变量&#xff1a;该变量只能被赋…

【SpringCloudAlibaba】Sentinel熔断限流工具的使用

一、前言 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维…

9.鸿蒙app用户界面的跳转abilityslice的跳转

9.用户界面的跳转abilityslice的跳转&#xff0c;值传递&#xff0c;数值累加 首页页面显示1&#xff0c;第2页显示2&#xff0c;再次点击返回首页3。。。 MainAbilitySlice.java 关键代码&#xff1a; 点击事件 text.setClickedListener(new Component.ClickedListener() …

vector实现循环队列

顺序队列 顺序队列是一种先进先出的线性表&#xff0c;简称FIFO。允许插入的一端称为队尾&#xff0c;允许删除的一端称为队头。因为其入队和出队操作均是&#xff08;front/rear&#xff09;指针向后移动&#xff0c;以进行结点的链接和删除&#xff0c;这就造成其使用空间不断…