调试 & 常数优化:我有特别的 debug 技巧

rxz 的调试技巧(https://www.zhihu.com/question/60719584/answer/179363450)

#define DEBUG printf("Passing [%s] in LINE %d\n",__FUNCTION__,__LINE__)

 


 C++ 的一个特性:

由于 C++ 中 a[b] = *(a+b) = *(b+a) = b[a]
因此你可以用 i[a] 代替 a[i],用 1[b] 代替 b[1],多维数组同样可以,你甚至可以用 5[4[3[2[1[a]]]]] 代替 a[1][2][3][4][5]。
用处,混乱代码 233。

—— immortalCO(https://www.zhihu.com/question/49272859/answer/115277716)

 


 Fast I/O:

inline int read() { // 快读
    int X=0,w=0;
    char ch=0;
    while(!isdigit(ch)) {
        w|=ch=='-';
        ch=getchar();
    }
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
inline double dbread() { // 小数快读
    double X=0,Y=1.0;
    int w=0;
    char ch=0;
    while(!isdigit(ch)) {
        w|=ch=='-';
        ch=getchar();
    }
    while(isdigit(ch)) X=X*10+(ch^48),ch=getchar();
    ch=getchar();
    while(isdigit(ch)) X+=(Y/=10)*(ch^48),ch=getchar();
    return w?-X:X;
}
inline void write(int x) { // 快些
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

 Fast Read 2

inline int read(){
    RR int x;RR bool f;RR char c;
    for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
    for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
    return f?-x:x;
}

 

 


 

strtol,strtoll 的用法(http://www.cnblogs.com/the-tops/p/5799547.html)

名字: strtol, strtoll, strtoul, strtoull

convert a string to a (signed, unsigned ) long integer string

声明:

 #include<stdlib.h>  ( 这个是C标准库,与linux无关。这套函数是通用的。)

long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr, int base);

说明,第一个参数 nptr是要转化的字符串。第三个参数base说明nptr的进制。base 取值范围 0,2-36

这几个函数会忽略nptr前面的空格( ' ', '\t', '\n' '\f', '\v' '\r' ,由isspace判定为真的字符)

while (*nptr && isspace ( *nptr ) ) ++ nptr;

然后 遇到非合法字符结束; 

base = 2; 合法字符为0, 1

base = 3; 合法字符为0,1, 2

...

base = 11; 合法字符为0,1,...,9,a(A)

...

base = 36;合法字符为0, 1, ...,9,a(A),...,z(Z)。

字符 a-z,是忽略大小写的,混着来也行,例如  strtol("aA", NULL, 11) 依然能得到正确的结果。

 

函数的第二个参数endptr可以为空,如果不为空,则 endptr 保存函数结束前的那个非合法字符的地址。

如果没有合法字符,则  *endptr = nptr ,函数返回0.

例如:

1.

char *endptr;
char nptr[]="123abc";
int ret = strtol(npstr, &endptr, 10 );

由于10进制里没有“数字”a,所以扫描到a,结束。

这样  ret = 123; 

 endptr = &nptr[3];  (  printf("%s", endptr); 将得到字符串 abc )

2.

char nptr[]=" \n\t    abc";
int ret = strtol(nptr, &endptr, 10 );

由于函数会忽略nptr前面的空格(' ', '\n'...),所以,从字符a开始扫描,但是遇见的“第一个”即是不合法字符。

所以函数结束。  ret=0; endptr = nptr; 

 

以下的讨论,会认为 nptr 前面没有空格,

即执行过类似于 while (*nptr &&isspace ( *nptr ) ) ++ nptr; 

如果base 为0.则分3种情况:

如果nptr 以0x(零x)开头,则把nptr当成16进制处理。

如果npstr以0(零)开头,则把nptr当成8进制处理。

否则,把nptr当成10进制。

 

对于函数执行错误,如传了一个非合法base,则errno会设置相关值

 

—— http://zengwu3915.blog.163.com/blog/static/27834897201262562912597/

 


 

奇♂技淫♂巧。。。

转载于:https://www.cnblogs.com/greyqz/p/debug.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值