小知识点

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. 一、Redis的Java客户端

    模糊的目标,要不断去解释它们,把他们转化成一个更具体的内容,这样才能够找到途径. 常用客户端介绍 Jedis客户端 基本使用(直连) 引入对应依赖 <dependency> <gro ...

  2. Java判断质数/素数的三种方法

    介绍 质数:在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数(素数) 解法 解法一:暴力枚举 枚举从2 ~ N的每一个数 实际上不用枚举到N,只需要枚举到√N就行 注意: 不要使用sqrt ...

  3. php变量规范命名用了记得消除,保证唯一性

    PHP中的命名规则 类的命名  在为类(class )命名前首先要知道它是什么.如果通过类名的提供的线索,还是想不起这个类是什么的话,那么就说明设计存在问题. 超过三个词组成的混合名是容易造成系统各个 ...

  4. 银河麒麟V10 SP1服务器操作系统-单用户模式与救援模式调试方法

    单用户模式 单用户模式:该模式下系统并没有完全运行进来,只是部分程序运行,包括网络服务,ssh服务等部分服务未运行,因此无法通过远程登录到操作系        统.进入单用户方式进行系统维护由是ROO ...

  5. LINQ to Entities 不识别方法“System.String get_Item(System.String)”,因此该方法无法转换为存储表达式。

    在使用EF的FirstOrDefault时出现异常.原因是EF的查询条件需要是一个变量否者就会出现这个原因 错误的代码 var userid= db.UserList.Where(u => u. ...

  6. 打印三位数的水仙花数Java

    public class Flower{ //水仙花数就是一个 个位数的立方+十位数的立方+百位数的立方=这个三位数 //153 = 1*1*1+5*5*5+3*3*3 public static v ...

  7. Pandas_1_预备知识

    Chapter1_Python基础 1.1 Python基础 推导式: 两个对象之间的映射关系,类似于实数之间关系变换的函数,只不过对象变成了矩阵. # Ex1-1 vacabulary = ['co ...

  8. 看完这篇,还不懂JAVA内存模型(JMM)算我输

    欢迎关注专栏[JAVA并发] 更多技术干活尽在个人公众号--JAVA旭阳 前言 开篇一个例子,我看看都有谁会?如果不会的,或者不知道原理的,还是老老实实看完这篇文章吧. @Slf4j(topic = ...

  9. tcp/udp 协议特性和三次握手

    一.TCP/UDP协议特性1)TCP特性:工作在传输层.建立连接.可靠的.错误检查 2)UDP特性:工作在传输层.不需要连接.不可靠的.有限的错误检查.传输性能高 2.控制位及确认号解释 控制位:由6 ...

  10. 事件 jQuery类库、Bootstrap页面框架

    目录 jQuery查找标签 基本选择器 组合选择器 层级选择器 属性选择器 基本筛选器 表单筛选器 筛选器方法 链式的本质(jQuery一行代码走天下) 操作标签 class操作 位置操作 文本操作 ...