小知识点

assert()函数

assert 断言函数,用于在调试过程中捕捉程序的错误。对某种假设条件进行检测,如果条件成立就不进行任何操作,如果条件不成立就捕捉到这种错误,并打印出错误信息,终止程序执行。在发行版本是不会执行的

win32管理单元

  • 大小:4字节
  • 也就是说一个char也会占用4字节

选字体原则

能区分0Oo1liB8

gets()函数

gets()由于没有提供限制输入字符串长度的方法,极容易造成内存溢出,导致安全隐患,建议不用

取整问题

C语言规定,除法运算为向零取整(即3.5向零取整为3,-3.5向零取整为-3)

printf("%d",10 % 3);		// 1
printf("%d",10 % -3); // 1
printf("%d",-10 % 3); // -1
printf("%d",-10 % -3); // -1

对应数学原理为

\[a/b = q,r <==> r=a-qb
\]

命令行显示不全问题

​ 今天在测试一个10000!(10000的阶乘)的时候,用控制台显示输出内容时,由于内容行数过大,虽然已经翻页了,但仍然看不到最前面的内容。

解决办法

​ 单击命令行窗口上边框->属性->布局,然后适当增大屏幕缓冲区高度大小即可。

各系统的栈地址

xp 0x0012XXXX
win7 0x0018XXXX
win10 0x0019XXXX

变量约定

变量类型 命名表示 自选
int n或i n
float f或flt flt
double d或dbl dbl
char c或by c
short int w或h h
char * pszpstr(psz表示‘\0'结尾的字符串,结尾不确定是不是’\0'的使用pstr) 根据情况使用
char sz[SIZE] szstr(sz表示‘\0'结尾的字符串,结尾不确定是不是’\0'的使用str) 根据情况使用

快速完成编译与链接的批处理脚本

del *.exe	//删除所在目录下所有exe文件
del *.obj //删除所在目录下所有obj文件
cl /c /W3 /WX /Od hello.c //编译hello.c文件,只编译不链接,采用3级警告并将警告视为错误,禁用优化 成功执行这步就会生成hello.obj文件
link hello.obj //链接hello.obj与所需库文件和其他目标程序,成功执行后就会生成hello.exe可执行文件
pause //暂停窗口等待进一步的操作
hello.exe //运行hello.exe文件

小端(大端)存储

小端:高地址存高位,低地址存低位(较高的有效字节存储在较高的存储器地址,较低的有效字节存储在较低的存储器地址)

大端:高地址存低位,低地址存高位(较高的有效字节存储在较低的存储器地址,较低的有效字节存储在较高的存储器地址)

代码规范(赋初值)

  • 初始化变量时需赋值,赋值为零或对应的错误值/无效值
  • 如果不赋初值,则变量的值为之前程序留下的残留数据,可能会导致程序时不时出现莫名的问题
  • 以下列举了一些常用类型的初值
变量 初值
int n 0
float flt 0.0f
double dbl 0.0
char c '\0'
int *p NULL

简单正则表达式

char szBuf[16] = {0};
scanf("%[0-9]15s",szBuf); // 只接受限制的字符,遇到其余字符会直接截断
表达式 作用
[0-9] 只接收0-9
[0,9] 只接收0或9两个数字
[^0] 除了0都能接收

随机数rand()函数

  • 实现文件:rand.c

  • 算法:

    • 单线程:(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff)

      holdrand 为静态全局变量,只会被初始化一次,初始化值为1L

    • 多线程:( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff )

      多线程实际和单线程算法是一样的,只是holdrand 不是全局变量,而是存储在每个线程独享的(_tiddata)结构体中,该数据在线程创建时被赋值为

      1L

  • 缺点:

    • 由于每次重新运行程序,随机种子都被赋值为1L,所以多次运行程序的结果都是一样的

srand()函数

  • 实现文件:rand.c
  • 功能:
    • 单线程:将静态全局变量holdrand 的值设置为函数参数值
    • 多线程:将当前线程的_holdrand 的值设置为函数参数值
  • 配合time(NULL)就能生成不同的随机种子,在调用rand()函数之前,调用该函数就能设置随机种子,该函数一个线程只需调用一次即可
/***
*rand.c - random number generator
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines rand(), srand() - random number generator
*
*******************************************************************************/ #include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h> #ifndef _MT
static long holdrand = 1L;
#endif /* _MT */ /***
*void srand(seed) - seed the random number generator
*
*Purpose:
* Seeds the random number generator with the int given. Adapted from the
* BASIC random number generator.
*
*Entry:
* unsigned seed - seed to seed rand # generator with
*
*Exit:
* None.
*
*Exceptions:
*
*******************************************************************************/ void __cdecl srand (
unsigned int seed
)
{
#ifdef _MT _getptd()->_holdrand = (unsigned long)seed; #else /* _MT */
holdrand = (long)seed;
#endif /* _MT */
} /***
*int rand() - returns a random number
*
*Purpose:
* returns a pseudo-random number 0 through 32767.
*
*Entry:
* None.
*
*Exit:
* Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/ int __cdecl rand (
void
)
{
#ifdef _MT _ptiddata ptd = _getptd(); // 每一个线程创建的时候,其 _holdrand 的值都被赋值为1L
return( ((ptd->_holdrand = ptd->_holdrand * 214013L
+ 2531011L) >> 16) & 0x7fff ); #else /* _MT */
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif /* _MT */
}

_tiddata结构体

  • 定义的文件:mtdll.h
  • 存储着线程数据(每个线程独享),其中_holdrand成员为随机种子
/* Structure for each thread's data */

struct _tiddata {
unsigned long _tid; /* thread ID */ unsigned long _thandle; /* thread handle */ int _terrno; /* errno value */
unsigned long _tdoserrno; /* _doserrno value */
unsigned int _fpds; /* Floating Point data segment */
unsigned long _holdrand; /* rand() seed value */
char * _token; /* ptr to strtok() token */
#ifdef _WIN32
wchar_t * _wtoken; /* ptr to wcstok() token */
#endif /* _WIN32 */
unsigned char * _mtoken; /* ptr to _mbstok() token */ /* following pointers get malloc'd at runtime */
char * _errmsg; /* ptr to strerror()/_strerror() buff */
char * _namebuf0; /* ptr to tmpnam() buffer */
#ifdef _WIN32
wchar_t * _wnamebuf0; /* ptr to _wtmpnam() buffer */
#endif /* _WIN32 */
char * _namebuf1; /* ptr to tmpfile() buffer */
#ifdef _WIN32
wchar_t * _wnamebuf1; /* ptr to _wtmpfile() buffer */
#endif /* _WIN32 */
char * _asctimebuf; /* ptr to asctime() buffer */
#ifdef _WIN32
wchar_t * _wasctimebuf; /* ptr to _wasctime() buffer */
#endif /* _WIN32 */
void * _gmtimebuf; /* ptr to gmtime() structure */
char * _cvtbuf; /* ptr to ecvt()/fcvt buffer */ /* following fields are needed by _beginthread code */
void * _initaddr; /* initial user thread address */
void * _initarg; /* initial user thread argument */ /* following three fields are needed to support signal handling and
* runtime errors */
void * _pxcptacttab; /* ptr to exception-action table */
void * _tpxcptinfoptrs; /* ptr to exception info pointers */
int _tfpecode; /* float point exception code */ /* following field is needed by NLG routines */
unsigned long _NLG_dwCode; /*
* Per-Thread data needed by C++ Exception Handling
*/
void * _terminate; /* terminate() routine */
void * _unexpected; /* unexpected() routine */
void * _translator; /* S.E. translator */
void * _curexception; /* current exception */
void * _curcontext; /* current exception context */
#if defined (_M_MRX000)
void * _pFrameInfoChain;
void * _pUnwindContext;
void * _pExitContext;
int _MipsPtdDelta;
int _MipsPtdEpsilon;
#elif defined (_M_PPC)
void * _pExitContext;
void * _pUnwindContext;
void * _pFrameInfoChain;
int _FrameInfo[6];
#endif /* defined (_M_PPC) */
}; typedef struct _tiddata * _ptiddata;

每个线程的随机种子赋值

  • 实现文件:tidtable.c
/***
*void _initptd(_ptiddata ptd) - initialize a per-thread data structure
*
*Purpose:
* This routine handles all of the per-thread initialization
* which is common to _beginthread, _beginthreadex, _mtinit
* and _getptd.
*
*Entry:
* pointer to a per-thread data block
*
*Exit:
* the common fields in that block are initialized
*
*Exceptions:
*
*******************************************************************************/ // 线程的初始化函数
void __cdecl _initptd (
_ptiddata ptd
)
{
ptd->_pxcptacttab = (void *)_XcptActTab;
ptd->_holdrand = 1L; // 每个线程的随机化种子 #ifdef _M_MRX000
/*
* MIPS per-thread data
*/
ptd->_MipsPtdDelta =
ptd->_MipsPtdEpsilon = -1L ;
#endif /* _M_MRX000 */
}

C-02\规范及随机数rand()原理的更多相关文章

  1. 【编程开发】C语言中随机数rand使用注意事项

    [编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...

  2. C++ 随机数rand()和srand()

    标准函数库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h中定义的一个整数,它与系统有关. 例如在我的机器上,RAND_MAX=32767.可以 ...

  3. sql server 生成随机数 rand函数

    https://docs.microsoft.com/en-us/sql/t-sql/functions/rand-transact-sql?view=sql-server-2017 在某一个区间内生 ...

  4. ULID规范解读与实现原理

    前提 最近发现各个频道推荐了很多ULID相关文章,这里对ULID的规范文件进行解读,并且基于Java语言自行实现ULID,通过此实现过程展示ULID的底层原理. ULID出现的背景 ULID全称是Un ...

  5. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  6. C/C++中产生随机数(rand,srand用法)

    计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535 ...

  7. C/C++随机数rand()和种子函数srand()

    在计算机编程中,常常要产生一个随机数.但是要让计算机产生一个随机数并不那么容易.计算机的执行,是以代码来进行的,所以并不可能像抽牌,扔骰子那样产生一个真正具有随机意义的数.只可能以一定的算法产生一个伪 ...

  8. C++随机数rand(), srand()

    c++产生随机数会用到rand(), srand()函数,下面总结两个函数特性和使用. 1. rand() #include <iostream> #include <cstdlib ...

  9. mysql 随机数 rand使用

    生成随机数 生成0-3的随机数 SELECT RAND() * 最大不会超过3, SELECT FLOOR(RAND() * ) 上面生成整数的值是0,1,2,3生成的随机整数是1,2,3的话,语句如 ...

  10. Fruit Ninja(随机数rand())

    链接:https://www.nowcoder.com/acm/contest/163/A来源:牛客网 题目描述 Fruit Ninja is a juicy action game enjoyed ...

随机推荐

  1. 2022春每日一题:Day 14

    题目:字符串归类 发现字符串长度总数不大,因此把每个字符串有的字母分离,存放到桶中,再枚举合并即可,时间复杂度O(len) 赛时代码: #include <cstdio> #include ...

  2. cookies和session总结

    1.作为基础知识,但是也是容易被我们忽略的知识. 2.从我的一次面试中,面试官问到,session是什么?和cookies有什么关系,当时我以为很简单,便顺口回答到,session是为了解决http无 ...

  3. cmd唤醒windows设置,并配置opsshd

    1. 从cmd唤起windows设置 这个东西很有意思,大部分在运行窗口输入的内容,从cmd或powershell都能唤起,如:control控制面板,但偶尔有些操作就不能通用, 如: ms-sett ...

  4. UBOOT编译--- UBOOT全部目标的编译过程详解(九)

    1. 前言 UBOOT版本:uboot2018.03,开发板myimx8mmek240. 2. 概述 本文接续上篇文章,采用自下而上的方法,先从最原始的依赖开始,一步一步,执行命令生成目标.这里先把上 ...

  5. 两行CSS让页面提升了近7倍渲染性能!

    前言 对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态.如果页面加载过慢,你的用户很可能会因此离你而去.所以页面性能对于前端开发者 ...

  6. 简单的sql注入3

    仍然 1 1' 1" 发现1'报错了.....我觉得作者对'情有独钟 再试试 1# 1'# 1"# 发现都可以正常登录 试试1' and '1'='1和1' and '1'='2发 ...

  7. MQ系列8:数据存储,消息队列的高可用保障

    MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系 ...

  8. 读 RocketMQ 源码,学习并发编程三大神器

    笔者是 RocketMQ 的忠实粉丝,在阅读源码的过程中,学习到了很多编程技巧. 这篇文章,笔者结合 RocketMQ 源码,分享并发编程三大神器的相关知识点. 1 CountDownLatch 实现 ...

  9. 【软考-中级-其他】03、NoSQL和云计算

    其他 NoSQL概述 分类 文档存储数据库:MongoDB 采用BSON格式完成存储数据和网络数据交换 BSON格式:JSON的二进制编码格式 逻辑结构包括:数据库.集合(相当于关系数据库的表).文档 ...

  10. 运维、监控、AIOps的几个重要观点

    监控是整个运维乃至整个产品生命周期中最重要的一环,通过配置合理的告警机制,采集准确的监控指标,来提前或者尽早发现问题,解决问题,进而保证产品的稳定,提升用户的体验.『分布式实验室』特约记者艾尔斯兰(下 ...