免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 20409 | 回复: 11

[C] 用DEV C++试验下面的程序,得不出正确结果 [复制链接]

论坛徽章:
0
发表于 2017-07-01 09:12 |显示全部楼层
#include <stdio.h>
#include "stdlib.h"

#define va_list void*
#define va_arg(arg, type)    *(type*)arg; arg = ((char*)arg + sizeof(type));
#define va_start(arg, start)  arg = (void*)((char*)&(start)) + sizeof(start)


int sum(unsigned char nr, ...)
{
    int i = 0;
    int result = 0;
    va_list arg = NULL;
    va_start(arg, nr);

    for(i = 0; i < nr; i++)
    {
        result += (int)va_arg(arg, unsigned char);  //有猫腻
    }
    return (int)result;
}

int main(int argc, char* argv[])
{
    printf("%d\n", sum(4, 100,100,100,100));
    printf("%d\n", sum(3, 200, 200, 200));


    return 0;
}


输出的结果是错误的,但是把unsigned char换成int,又是正确的,上面加粗的字体换成int.
不知道是什么原因。


论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
发表于 2017-07-01 09:27 来自手机 |显示全部楼层
nonono,问题不是支付方式,而是金额。
你要的这个东西显然已经超出论坛技术讨论的范围,我拍脑袋的估一下差不多要一周左右的工作量,假设你找了一个月薪20000的人帮你做这件事,至少就得掏5000块,而且一般零活的价钱会在月结工资的基础上再向上浮动10~20%。

不知道lz有没有做好掏6000块的心理准备。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2017-07-01 10:41 |显示全部楼层
你单写一个数字它的类型就是int(或者long等等)喽,你得写成'\x64'它的类型才是char。
int的尺寸和char是不一样的,但va_arg并不知道,得你告诉它,你告诉它的是错那当然就不对了。

@Windows19 你真逗,你拍脑袋得多使劲才能拍出一周的工作量?还是赶紧去医院看看吧,晚了怕留后遗症。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2017-07-01 17:34 |显示全部楼层
回复 3# windoze

猫哥你伤害了他

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2017-07-01 17:34 |显示全部楼层
回复 2# Windows19

直接放到签名上,每回一帖都带上这段

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2017-07-03 08:20 |显示全部楼层
对于 void foo( char a, char b )
你认为 &a 和 &b 之间相差 sizeof(char) 吗?不是,而是“至少”相差sizeof(char)。
按照标准,a/b 是扩展到int而后入栈的,所以相差sizeof(int)。
另外,a、b等等还可以是通过寄存器,而非调用栈,来传递。所以你的代码没有可移植性呀,为什么不用 <stdarg.h> 中定义的 va_list 等宏?

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2017-07-03 08:52 |显示全部楼层
可变参数是通过栈传递的!根据编译器具体实现,小粒度参数的尺寸大小可能会扩展到32位,所以那些相关的宏也是编译器相关的。

鼓励楼主自主实现的实践尝试,实力是一步步逐渐提高的

论坛徽章:
0
发表于 2017-07-03 10:08 |显示全部楼层
回复 7# 爻易

谢谢指点。

论坛徽章:
0
发表于 2017-07-03 10:09 |显示全部楼层
回复 3# windoze

谢谢高手。

论坛徽章:
0
发表于 2017-07-03 10:11 |显示全部楼层
回复 6# bruceteen
谢谢高手。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP