游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1832|回复: 4

近期RP狂差

[复制链接]

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-3-16 09:47:00 | 显示全部楼层 |阅读模式
帮学生做题,才知道位移量过大要取模这回事 = =
求陷阱题~ 谢谢  = =

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
 楼主| 发表于 2007-3-16 10:00:00 | 显示全部楼层

Re:近期RP狂差

  1. /* 请预测正确结果,并说下程序走的流程细节 */

  2. #include <stdio.h>

  3. int main()
  4. {
  5.     char a[20] = "Hello", *b = "World";
  6.     char *ps1 = a, *ps2 = b;
  7.     while(*ps1++);
  8.     while(*ps1++ = *ps2++);
  9.     *ps1 = '\0';
  10.     puts(a);
  11.     return 0;
  12. }
复制代码

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2007-3-16 12:52:00 | 显示全部楼层

Re:近期RP狂差

ps1所指向的内容其实是"Hello\0\0\0\0\0...\0" (15个\0)
所以while(*ps1++);最后停在\0处,也就是a[5]的位置
接下来while(*ps1++ = *ps2++);是从a[6]的位置开始继续写入ps2中的内容
即使*ps1 = '\0';搞得像真的一样
其实a变成是"Hello\0World\0\0\0\0...\0"
因为a[5]='\0'这个事实并没有改变
所以在puts(a);的时候依然是"Hello"

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2007-3-17 04:30:00 | 显示全部楼层

Re:近期RP狂差

VC2005的DEBUG下位移过大不取模了,直接给你优化成结果0
不过标准C有明确规定位移不能过大。虽然intel的CPU的位移指令会帮你取模,但是编译器要强制给你随便弄个啥值也无话可说。毕竟标准里未定义,随便怎么弄都行。

0

主题

6

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2007-3-22 17:01:00 | 显示全部楼层

Re:近期RP狂差

三楼所言极是,改成 while(*(++ps1)); 即可
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 19:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表