免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc
打印 上一主题 下一主题

[C] 初中级C语言水平自测:srand((int)time(0)); 有没有错? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-09-25 10:20 |只看该作者
Should I use NULL or 0?
In C++, the definition of NULL is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0. Another problem with NULL is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. In pre-standard code, NULL was/is sometimes defined to something unsuitable and therefore had/has to be avoided. That's less common these days.

If you have to name the null pointer, call it nullptr; that's what it's called in C++11. Then, "nullptr" will be a keyword.


转自 Bjarne Stroustrup's C++ Style and Technique FAQ
http://www.stroustrup.com/bs_faq2.html#null

论坛徽章:
0
12 [报告]
发表于 2012-09-25 10:23 |只看该作者
3 An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.


转自 C99 6.3.2.3 Pointers

论坛徽章:
0
13 [报告]
发表于 2012-09-25 10:28 |只看该作者
C++也有标准支持

C++2003
4.10 Pointer conversions [conv.ptr]
1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero. (略...)


C++11
4.10 Pointer conversions [conv.ptr]
1 A null pointer constant is an integral constant expression (5.19) prvalue of integer type that evaluates to zero or a prvalue of type std::nullptr_t.


所有标准都支持 integer constant zero as null pointer。本人也习惯直接写0,而不是宏。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
14 [报告]
发表于 2012-09-25 21:20 |只看该作者
回复 7# zylthinking


    我刚刚在Lua邮件列表看到了一个帖子:这的确是错,浮点转整型,如果超出了整型所能表示的范围,是UB,即如果time返回一个负的浮点值(额,这个可能性似乎不大),而转换成unsigned,那么就是UB。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
15 [报告]
发表于 2012-09-25 21:30 |只看该作者
starwing83 发表于 2012-09-25 21:20
回复 7# zylthinking


time_t不是浮点类型。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
16 [报告]
发表于 2012-09-25 21:32 |只看该作者
回复 15# mirnshi


    我回复的是7楼,你仔细看看我们讨论的前提?

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
17 [报告]
发表于 2012-09-25 21:40 |只看该作者
starwing83 发表于 2012-09-25 21:32
回复 15# mirnshi


原来在歪楼。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
18 [报告]
发表于 2012-09-26 10:06 |只看该作者
本帖最后由 zylthinking 于 2012-09-26 11:16 编辑
starwing83 发表于 2012-09-25 21:20
回复 7# zylthinking



你管他是不是 UB, 就算是 UB 怎么了, 会导致 srand 出错? srand 期待说我的参数必须是一个 非UB 的操作的结果???

似乎说的不是很清楚, 那么再说2句:
srand 只期待一个 sizeof(unsigned) 的数, 它并不管这个数是怎么来的, 就算他认为是 unsigned 的哪个数其实并不是 unsigned, 而是double, 或者任意值, 那也无妨, 解释成 unsigned 就是了。
srand 本身期待这个参数本就是一个任意值, 因此, 无论原来 double 之类专 unsigned 多么 UB, 只要能转换成功, srand 就获得了一个输入, 而且, 不管它的值是什么, 都是 srand 期待的。
要说有错误, 只有这种情况下有, 就是 time_t 不能转换成 int,  只要int 出来了, 神也阻止不了 int 变成 unsigned int

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
19 [报告]
发表于 2012-09-26 11:41 |只看该作者
回复 18# zylthinking


    你知道ub是什么意思么?就是任何事情都可能发生,可能直接返回0让你每次运行程序随机数都一样(苹果就这样),可能程序直接崩溃(访问了非法地址神马的),也可能烧cpu……UB的意思是一切皆有可能,程序是不能依赖UB行为的,这是常识你不知道???

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
20 [报告]
发表于 2012-09-26 11:56 |只看该作者
starwing83 发表于 2012-09-26 11:41
回复 18# zylthinking

你知道ub是什么意思么?就是任何事情都可能发生,可能直接返回0让你每次运行程序随机数都一样(苹果就这样),可能程序直接崩溃(访问了非法地址神马的),也可能烧cpu……UB的意思是一切皆有可能,程序是不能依赖UB行为的,这是常识你不知道???


1. 我不知道还有能烧 CPU 的 UB, 我就知道有个能损害硬件的 CIH, 但那个是驱动级的病毒。
2. 莫非 srand(0) 就是错误么? 莫非会损害rand 的随机性? 只不过让伪随机数变得可预测, 给软件安全带来不稳定因素而已。 歪楼: 0 难道就是特殊值, 莫非静态调用 srand(2) 然后 rand 返回的就不可预测了???
3. 访问一个 time_t 莫非能崩溃??? 如果不能崩溃, 强制转换一个 time_t 会引起崩溃??? 你是不是觉得可能位数的不一致可能导致崩溃, 比如 time_t 是1位, 然后强制类型转换将后面的31位(假设)给占去了??? 如果是这样, 你是不是也认为 char c; int n = (int) c; 也会崩溃??? 歪楼: c 前的 (int) 是故意加的, 别象专家似的觉得拣了个宝。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP