sizeif(i++).sizeof(++i) 的问题

考虑以下代码:

int i = 3;
int j = sizeof(++i);
int k = sizeof(i++);
cout << i << endl;

对上述代码,输出的结果为 : 3


原因:根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, k= sizeof(i++); 在编译的时候被翻译成 j=sizeof((i++的数据类型)) 也就是 j = sizeof(int); 也就是 j= 4; (32bit系统,如果是16位系统,则j=2) 然后才会继续编译成最终的程序,当然在最终程序执行的时候,自然不会执行任何++i 或 i++ 了。

以下是对这段 C++ 代码实现大整数加法时存在错误的分析: ### 1. `BIGINT` 函数中的 `for` 循环条件错误 在 `BIGINT` 函数里,`for` 循环的条件 `i < a.cnt && i < b.cnt` 存在问题。此条件会使循环在 `i` 达到 `a.cnt` 和 `b.cnt` 中较小值时就停止,从而无法处理较长数字剩余的部分。正确做法是使用 `i <= a.cnt || i <= b.cnt` 来保证处理完所有位。 ### 2. `while` 循环条件错误 `BIGINT` 函数中的两个 `while` 循环条件 `i > a.cnt` 和 `i > b.cnt` 有误,这会让循环根本不执行,因为初始 `i` 小于 `a.cnt` 和 `b.cnt`。应该使用 `i <= a.cnt` 和 `i <= b.cnt` 来处理剩余的位。 ### 修正后的代码 ```cpp #include<bits/stdc++.h> using namespace std; #define ll long long string s1,s2; struct bigint{ ll num[101]; ll cnt; }; void initbigint(bigint &a,string s){ memset(a.num,0,sizeof(a.num)); a.cnt=0; ll i; for(i=0;i<s.size();i++){ a.num[i]=s[s.size()-1-i]-'0'; } a.cnt=s.size()-1; } void print_bigint(bigint &a){ ll i; for(i=a.cnt;i>=0;i--){ cout<<a.num[i]; } cout<<endl; } void BIGINT(bigint &a,bigint &b,bigint &c){ ll i,carry=0; memset(c.num,0,sizeof(c.num)); for(i=0;i<=a.cnt || i<=b.cnt;i++){ ll tmp = (i <= a.cnt? a.num[i] : 0) + (i <= b.cnt? b.num[i] : 0) + carry; c.num[i]=tmp%10; carry=tmp/10; } if(carry){ c.num[i]=carry; c.cnt=i; }else{ c.cnt=i-1; } } int main(){ bigint a,b,c; cin>>s1>>s2; initbigint(a,s1); initbigint(b,s2); print_bigint(a); BIGINT(a,b,c); print_bigint(c); return 0; } ``` ### 修正说明 - 在 `BIGINT` 函数的 `for` 循环中,将条件改为 `i <= a.cnt || i <= b.cnt`,确保处理完所有位。 - 去掉了错误的 `while` 循环,在 `for` 循环里通过 `(i <= a.cnt? a.num[i] : 0)` 和 `(i <= b.cnt? b.num[i] : 0)` 来处理不同长度数字的情况。 - 若最后还有进位,将进位存于 `c.num[i]` 并更新 `c.cnt`;若没有进位,`c.cnt` 为 `i - 1`。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值