Determines whether a particular character is an ASCII character.
__isascii(
c
);
iswascii(
w_t c
);
测试:
# "stdafx.h"
# "ctype.h"
# "locale.h"
# "stdio.h"
void CheckCharAndPr(char acChar)
{
(__isascii(acChar))
{
prf("char %c is a ascii char.\n",acChar);
}
{
// 此处无法正常输出中文没有深入研究了
prf("char %c is not a ascii char.\n",acChar);
}
}
void CheckWCharAndPr(wchar_t awcChar)
{
(iswascii(awcChar))
{
wprf(L"wchar %c is a ascii char.\n",awcChar);
}
{
locale(LC_ALL,"");
wprf(L"wchar %c is not a ascii char.\n",awcChar);
}
}
_t( argc, _TCHAR* argv)
{
char lcC = 'a';
char lcD = '中';
CheckCharAndPr(lcC);
CheckCharAndPr(lcD);
wchar_t lwcC = L'a';
wchar_t lwcD = L'中';
CheckWCharAndPr(lwcC);
CheckWCharAndPr(lwcD);
0;
}
介绍说明:
__isascii是个比较特殊它以两个前置下划线开头这在C语言中并不多见(起码我看到比较少)
此应该不属于标准库TCPL中C语言参考中并没有描述但是gcc中有此也就是说linux下也能正常使用此
iswascii这个__isascii宽字节版本如同很多宽字节版本样这个属于MS自己扩于是linux下无法使用此要使用只能自己实现罗
实现:
MS:
# __isascii(_Char) ( (unsigned)(_Char) < 0x80 )
inline __cdecl iswascii(w_t _C) { ((unsigned)(_C) < 0x80); }
gcc:
# __isascii(c) (((c) & ~0x7f) 0) /* C is a 7 bit value*/
__isascii都是个简单宏MSiswascii原理和其__isascii都样仅仅是个内联
微软实现是依赖于小于128(0x80)这里还做了次强转不是太理解实际char可以直接作为整数来比较也许仅仅是为了屏蔽warning?
gcc实现是依赖于除低 7位外无任何其他值即先将127(0x7f)取反再和位和实际就是取得c除了低 7位以外值再比较此值是否为零
想不到个这样简单MS,gcc实现差别都这么大相对而言MS实现自然是比较浅显易懂但是gcc用这么复杂实现应该有更好效率
就分析而言强转+小于操作 运行时间大于 次取反次位和次等于操作还真不容易知道谁效率真更高那么就测试下吧
效率测试:
# "jtianling.h"
# __isasciims(_Char) ( (unsigned)(_Char) < 0x80 )
# __isasciigcc(c) (((c) & ~0x7f) 0) /* C is a 7 bit value*/
const DEF_TEST_TIMES = 1000000000;
void CheckMS(char ac)
{
double ldTimeLast = jtianling::GetTime;
for ( i=0; i<DEF_TEST_TIMES ; i)
{
__isasciims(ac);
}
double ldTimePast = jtianling::GetTime - ldTimeLast;
prf("__isasciims %c run %d times cost %lf secs.\n", ac, DEF_TEST_TIMES, ldTimePast);
}
void Checkgcc(char ac)
{
double ldTimeLast = jtianling::GetTime;
for ( i=0; i<DEF_TEST_TIMES ; i)
{
__isasciigcc(ac);
}
double ldTimePast = jtianling::GetTime - ldTimeLast;
prf("__isasciigcc %c run %d times cost %lf secs.\n", ac, DEF_TEST_TIMES, ldTimePast);
}
_t( argc, _TCHAR* argv)
{
char lc = 'a';
char lc2 = '中';
CheckMS(lc);
Checkgcc(lc);
CheckMS(lc);
Checkgcc(lc2);
0;
}
至于GetTime意义请参考我以前写库无非就是获取当前时间不知道也没有关系你可以用time(NULL)来替代只不过精度没有这个高而已
实际测试结果很让人失望在测试了几乎无数次以后MS和gcc实现效率都几乎相同在10亿这个级别gcc也不过有时快0.1秒而已而且多次运行还不是太稳定看来并不是复杂实现就定好
相关:
msdn:
Converts characters.
__toascii(
c
);
这个也是个双前置下划线MS,gcc中都有实现而且在此时实现都是样
# __toascii(_Char) ( (_Char) & 0x7f )
gcc注释到 “mask off high bits.”
这里和gcc中__isascii实现前部分很像个是去除低 7位个是保留低 7位看了这个以后才知道gcc为什么想到这样实现__isascii了
个人想法:
这两个在实际中我从来没有用到过假如不是我工作范围太窄那就是这两个使用性并不强了确我没有事去把个值转为ascii?是ascii话就没有意义不是话原来含义还能保留吗?至于__isascii可能还在某些情况下有用吧只不过我没有用到过谁有实际中使用此两个代码可以告诉我下
另外整理总结是虽然C Runtime库MS也有源码但是完全没有任何注释相对而言gcc注释就算是很丰富和详细了呵呵毕竟开源代码就是不样啊做来就是给人看想想这样分析下去光是看源代码收获都不会太小
最新评论