几道有意思的C++题目

例1:已知某计算机机器字长16位,试指出下述C语句的执行结果。

int i=40000;
printf("%d",i);

分析:首先我们复习一下C++里面的数据类型:

数据类型符号 所对应的机器字长
int、unsigned int 整数字(有、无符号)
short、unsigned short 整数半字(有、无符号)
long、unsigned long 整数双字(有、无符号)
long long 整数四字
char、unsigned char 整数字节(有、无符号)
Float 浮点数字
Double 浮点数双字
long double 浮点数四字(倍双字)

数据类型和机器字长密切相关,题目中定义的int类型,因此存储长度为一个字长,也就是16位,我们先将i变换为十六进数得:40000=0X9c40,为有符号整数(即将占用一位数的符号位)且符号位为1(即为负数)

所以编译系统将计算其视为补码(即求反加1,得-0X63c0),因此执行后的输出结果为-25536

例2:已知某程序内的初始数据声明为:char* p=”acd”;当该程序运行到某时刻时,使指针指向字符串内字符‘c’的位置,试判断下述四条C语句中哪一条能够正确取得该字符串内的字符‘a’?

(A)     *p–;         (B) *–p;         (C) *p-1;         (D) *(p–)

分析:地址数值为同长、同类型数据,故该计算将涉及到多重转换的优先策略(即地址变更与对地址的一次间址访问的优先策略)。当复合发生地址变换与访内操作时则要是各自运算符号的相对位置而定。因此可很容易的判断出(B)是正确的语句。辨别该问题正确解答的关键是正确理解间接寻址和多元访问的顺序规则。

例3:试说明C语句“i+++j;”的计算策略。

分析:编译扫描自左向右,故判断操作对象与运算的关系应形成”i++”和’j’两个部分,又”i++”为一元运算,故先予计算。若编译器的扫描方向逆转,则先计算++j也是正确的。所以针对不同的编译器有不同的结果。

使用不同的数据类型与数据长度时应考虑其相互间的(编译)变换规则;

例4:试判断出下述C程序的执行结果(16位字长机器):

long s,l=5;
unsigned int u=4;
char c=-3;/*0Xfd*/
s=l+u*c;/*预期值为-7*/
printf(“%ld”, s);  

首先计算u*c,在这之中的c先转换成无符号整数(即0Xfffd),然后完成u*c计算(乘4即左移两位)并获得中间结果0Xfff4。然后为计算l与该中间结果的和,则先让无符号整数的中间结果转换为与l相同的有符号双字(即0X0000fff4),则s=65529(即0X0000fff9。

与预期值不一致的根本原因在于c经历了两次符号间的转换。如果在开始计算之前便使所有计算量值都一致,则此问题就可以避免了。

既将“s=l+u*c;”语句改为“s=l+(long)u*c;” 在近年来的编译器中可以省略强制。

首发于本人博客www.xgezhang.com

时间: 2024-12-13 14:09:03

几道有意思的C++题目的相关文章

两道有意思的题目

碰到两道有意思的题目,记录一下. 题目一: 问,对于任意一个正整数,是否存在一个它的倍数全是由1和0组成? 例如: 1 * 1 = 1 2 * 5 = 10  (2的5倍是10,10由1和0组成) 3 * 37 = 111 (3 的 37 倍是111,111 全部由1组成) 4 * 25 = 100 (4 的 25 倍是100,100 由1和0组成) 5 * 20 = 100 (5 的 20 倍是100,100由1 和 0 组成) …… 现在需要判断,随便给一个正整数,是否存在一个它的倍数满足题

几个有意思的算法题目

这两天奔波于参加了两场校招面试,其中有很多非常有意思的算法题目,有一部分甚至都没有找到最优的答案,比较开放的算法设计题目. 其实面试不只是算法题的交流,当中还穿插着各式各样的非技术问题,毫无防备,都不知道如何展示自己了. 看似数学推理的程序设计题: 一个盒子中有100个白球,100个黑球,每次从盒子中不放回的取出两个球,如果取得的两个球是颜色相同,放入一个白球,如果取得的两个球颜色不同,放入一个黑球?最后盒子中剩下一个黑球的概率为多少? 拓展:一个盒子中有m个白球,n个黑球,按照上面的方案,最后

12道人工智能领域的题目

12道人工智能领域的题目,答题的过程让大家都get到新姿势了吗? 在收到的48个回答中,有两位读者全部答对,真的是非常厉害啦! 今天,就让我们一起回顾一下题目,并看看正确答案的解释吧! 1.人工智能历史上第一个战胜人类的棋类游戏是? A.国际象棋 B.围棋 C.西洋双陆棋 D.四国军棋 1979年,由Hans Berliner(1929-2017)开发的一个西洋双陆棋程序,以7:1的成绩击败了当时的世界冠军Luigi Villa.创下了计算机第一次在智力游戏中击败冠军级别人类竞争对手的历史. 2

一道有意思的JavaScript 题目

今天在网上看到一道题,觉得很有意思就把它抄下来解了.题目是这样的: 1 function Parent() { 2 this.a = 1; 3 this.b = [1, 2, this.a]; 4 5 this.c = { demo: 5 }; 6 this.show = function () { 7 console.log(this.a , this.b , this.c.demo ); 8 /* alert(this.b);*/ 9 } 10 } 11 function Child() {

两道CTF Web的题目

1.easyphp 1.1.题目描述 题目首先是一张不存在的图片 查看源码发现只有一句话 <img src="show.php?img=aGludC5qcGc=" width="100%"/> 点开源码中图片的链接,跳转到下面的页面 img 后面的内容很像是 base64 编码,经过解码验证,确实是 base64 编码,还原后是 hint.jpg . 尝试把 img 后面的参数用 flag.jpg.flag.php.flag 的base64编码代替后访问

我觉得有意思的JavaScript题目(01-05更新中)

对于以下js题目均来至于网络中.有的来至于文章之中,有的也许来至于问答题型中. 如果你有更好的问题解释,请留言交流! 1.相关问题描述:到底该怎么去理解闭包? 代码片段A: !function(){ var num=1; var exp={}; functionadd(num){ return num++; } exp.getAddNum=function(){ return add(num); } window.a=exp; }() console.log(a.getAddNum()); //

CTF 两道web整数溢出题目(猫咪银行和ltshop)

①猫咪银行: (2018中科大hackgame) 一开始给十个CTB,而flag需要20个CTB,我们需要理财赚够20个. 理财是只能买入TDSU才可以获得收益.我们先上来直接把CTB全部换成TDSU. 上边是我们花了所有TDSU:66060买了19分钟后的收益.(因为一个账号最多存在20分钟,计算你用脚本极限也不能买20分钟,必须留一分钟用来换TDSU和买入,取出等操作) 还是不行,算上收益的钱1200231也不够买20个CTB. 考虑买RMX是否存在汇率差. 发现一个CTB57个RMX,一个

有意思的c++题目

1 #include <iostream> 2 #include<stdlib.h> 3 using namespace std; 4 5 class A 6 { 7 public: 8 int _a; 9 A() 10 { 11 _a = 1; 12 } 13 void print() 14 { 15 printf("%d\n", _a); 16 } 17 }; 18 19 class B: public A 20 { 21 public: 22 int _a

自动生成30道四则元算题目

主要分成三部分来解决这个问题. 输入:自动输入 功能实现:生成6个随机数,有两个分子,两个分母,一个控制运算符,一个控制整数算式还是分数算式 输出:根据控制整数算式还是分数算式的随机数,进行相应的输出 #include<iostream>#include<string>#include<time.h>using namespace std;void main(){  int a[6],b=0,c,e;  string str="+-*/";  for