int a1=x+y-z; int a2=x-z+y; a1和a2的值一定相等吗? (某公司实习生招聘笔试试题)

本文通过具体示例深入分析了一道关于整数运算的题目,揭示了不同运算符组合下表达式的计算规律,并给出了正确答案及解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       我们先来看看原题:

 

给定3个int类型的正整数x,y,z,对如下4组表达式判断正确的选项()

 

int a1=x+y-z; int b1=x*y/z;


int a2=x-z+y; int b2=x/z*y;


int c1=x<<y>>z; int d1=x&y|z;


int c2=x>>z<<y; int d2=x|z&y;

 

A、a1一定等于a2

B、b1一定定于b2

C、c1一定等于c2

D、d1一定等于d2

      

      首先说明,正确答案是A.   但是, 相信多数同学第一眼就把正确答案A排除了, 估计是被“溢出”吓坏了, 下面, 我们来分析一下:

A.

    为了简便起见, 我们用char来模拟int.

 

#include <iostream>
using namespace std;

int main()
{
	char x = 126;
	char y = 24;
	char z = 65;

	char a1 = x + y - z;  // x + y有溢出, 但是 - z后可以减回来
	char a2 = x - z + y;

	cout << a1 << endl;
	cout << a2 << endl;

	return 0;
}

       结果a1和a2是相等的, 为什么呢? 因为char的范围在[-128 127]内循环转127 + 1 = -128,   而-128 + 1 = -127,-128 - 1 = 127

 

 

 

#include <iostream>
using namespace std;

int main()
{
	int x = 2;
	int y = 3;
	int z = 6;

    int b1= x * y / z;
    int b2 = x / z * y;

	cout << b1 << endl; // 1
	cout << b2 << endl; // 0

	return 0;
}

 

 

C

 

#include <iostream>
using namespace std;

int main()
{
	int x = 2;
	int y = 2;
	int z = 2;

    int c1 = x << y >> z; // 2先乘以4, 再除以4
    int c2 = x >> z << y; // 2先除以4, 再乘以4

	cout << c1 << endl; // 2
	cout << c2 << endl; // 0

	return 0;
}


D.

 

 

#include <iostream>
using namespace std;

int main()
{
	int x = 1;
	int y = 2;
	int z = 4;

    int d1 = x & y | z;
	int d2 = x | z & y;

	cout << d1 << endl; // 4
	cout << d2 << endl; // 1

	return 0;
}

      

 

           最后需要补充说明的是: 考试的时候, 肯定没有电脑写程序啊, 但用笔分析一下, 也非常简单, 而且更快。


 

#include <bits/stdc++.h> using namespace std; using ll=long long; const int N=1e2+2; int a1[N];//数形式存储元素的用于位运算,a[0]为个位..... int a2[N]; int a3[N]; char s1[N]; //以字符串形式输入元素 char s2[N]; int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>s1>>s2; for(int i=0;i<strlen(s1);i++) { a1[strlen(s1)-i-1]=s1[i]-&#39;0&#39;; } for(int i=0;i<strlen(s2);i++) { a2[strlen(s2)-i-1]=s2[i]-&#39;0&#39;; } int len=max(strlen(s1),strlen(s2)); if(strlen(s1)>=strlen(s2)) { if(strlen(s1)>strlen(s2)) //多位数-少位数 { for(int i=0;i<len;i++) { a3[i]+=a1[i]-a2[i]; if(a3[i]<0) { a3[i]=10+a3[i]; a3[i+1]=a3[i+1]-1; } } for(int i=len-1;i>=0;i--) { cout<<a3[i]; } } else //位数相同 需要找出最高位大的数 { if(s1<s2) //数s1更大 字典序更小 { for(int i=0;i<len;i++) { a3[i]+=a1[i]-a2[i]; if(a3[i]<0) { a3[i]=10+a3[i]; a3[i+1]=a3[i+1]-1; } } int begin=len-1; for(begin=len-1;begin>=0;begin--) { if(a3[begin]!=0) { break; } } for(int i=begin;i>=0;i--) { cout<<a3[i]; } } else if(s1>s2) { for(int i=0;i<len;i++) { a3[i]+=a2[i]-a1[i]; if(a3[i]<0) { a3[i]=10+a3[i]; a3[i+1]=a3[i+1]-1; } } int begin=len-1; for(begin=len-1;begin>=0;begin--) { if(a3[begin]!=0) { break; } } cout<<"-"; for(int i=begin;i>=0;i--) { cout<<a3[i]; } } else if(s1==s2) { cout<<0; } } } else //S2更大 { for(int i=0;i<len;i++) { a3[i]+=a2[i]-a1[i]; if(a3[i]<0) { a3[i]=10+a3[i]; a3[i+1]=a3[i+1]-1; } } cout<<"-"; for(int i=len-1;i>=0;i--) { cout<<a3[i]; } } return 0; }
03-29
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值