Determines whether a particular character is an ASCII character.
int __isascii(
int c
);
int iswascii(
wint_t c
);
測(cè)試程序:
#include "stdafx.h"
#include "ctype.h"
#include "locale.h"
#include "stdio.h"
void CheckCharAndPrint(char acChar)
{
if(__isascii(acChar))
{
printf("char %c is a ascii char.\n",acChar);
}
else
{
// 此處無法正常輸出中文,沒有深入研究了
printf("char %c is not a ascii char.\n",acChar);
}
}
void CheckWCharAndPrint(wchar_t awcChar)
{
if(iswascii(awcChar))
{
wprintf(L"wchar %c is a ascii char.\n",awcChar);
}
else
{
setlocale(LC_ALL,"");
wprintf(L"wchar %c is not a ascii char.\n",awcChar);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char lcC = 'a';
char lcD = '中';
CheckCharAndPrint(lcC);
CheckCharAndPrint(lcD);
wchar_t lwcC = L'a';
wchar_t lwcD = L'中';
CheckWCharAndPrint(lwcC);
CheckWCharAndPrint(lwcD);
return 0;
}
說明:
__isascii是一個(gè)比較特殊的函數(shù),因?yàn)樗詢蓚€(gè)前置下劃線開頭。這在C語言中并不多見。(起碼我看到的比較少)
此函數(shù)應(yīng)該不屬于標(biāo)準(zhǔn)庫函數(shù),《TCPL》中,《C語言參考》中并沒有描述,但是gcc中有此函數(shù)。也就是說linux下也能正常使用此函數(shù)。
iswascii這個(gè)__isascii函數(shù)的寬字節(jié)版本,如同很多寬字節(jié)版本的函數(shù)一樣,這個(gè)函數(shù)屬于MS自己擴(kuò)的,于是。。linux下無法使用此函數(shù),要使用,只能自己實(shí)現(xiàn)羅。
實(shí)現(xiàn):
MS:
#define __isascii(_Char) ( (unsigned)(_Char) < 0x80 )
inline int __cdecl iswascii(wint_t _C) {return ((unsigned)(_C) < 0x80); }
gcc:
#define __isascii(c) (((c) & ~0x7f) == 0) /* if C is a 7 bit value*/
__isascii都是一個(gè)簡(jiǎn)單的宏。MS的iswascii原理和其__isascii都一樣,僅僅是一個(gè)內(nèi)聯(lián)的函數(shù)。
微軟的實(shí)現(xiàn)是依賴于字符小于128(0x80),這里還做了一次強(qiáng)轉(zhuǎn),不是太理解,因?yàn)閷?shí)際char可以直接作為整數(shù)來比較,也許僅僅是為了屏蔽warning?
gcc的實(shí)現(xiàn)是依賴于字符除低七位外無任何其他值。即先將127(0x7f)取反,再與字符位與。實(shí)際就是取得字符c除了低七位以外的值。再比較此值是否為零。
想不到一個(gè)這樣簡(jiǎn)單的函數(shù),MS,gcc的實(shí)現(xiàn)差別都這么大,相對(duì)而言MS的實(shí)現(xiàn)自然是比較淺顯易懂的,但是gcc用這么復(fù)雜的實(shí)現(xiàn),應(yīng)該有更好的效率。
就分析而言,強(qiáng)轉(zhuǎn)+小于操作 運(yùn)行時(shí)間大于 一次取反一次位與一次等于操作。還真不容易知道誰的效率真的更高。那么就測(cè)試一下吧
效率測(cè)試:
#include "jtianling.h"
#define __isasciims(_Char) ( (unsigned)(_Char) < 0x80 )
#define __isasciigcc(c) (((c) & ~0x7f) == 0) /* if C is a 7 bit value*/
const int DEF_TEST_TIMES = 1000000000;
void CheckMS(char ac)
{
double ldTimeLast = jtianling::GetTime();
for (int i=0; i {
__isasciims(ac);
}
double ldTimePast = jtianling::GetTime() - ldTimeLast;
printf("__isasciims %c run %d times cost %lf secs.\n", ac, DEF_TEST_TIMES, ldTimePast);
}
void Checkgcc(char ac)
{
double ldTimeLast = jtianling::GetTime();
for (int i=0; i {
__isasciigcc(ac);
}
double ldTimePast = jtianling::GetTime() - ldTimeLast;
printf("__isasciigcc %c run %d times cost %lf secs.\n", ac, DEF_TEST_TIMES, ldTimePast);
}
int _tmain(int argc, _TCHAR* argv[])
{
char lc = 'a';
char lc2 = '中';
CheckMS(lc);
Checkgcc(lc);
CheckMS(lc);
Checkgcc(lc2);
return 0;
}
至于GetTime函數(shù)的意義,請(qǐng)參考我以前寫的庫,無非就是獲取當(dāng)前時(shí)間,不知道也沒有關(guān)系。你可以用time(NULL)來替代,只不過精度沒有這個(gè)函數(shù)高而已。
實(shí)際的測(cè)試結(jié)果很讓人失望,在測(cè)試了幾乎無數(shù)次以后,MS和gcc的實(shí)現(xiàn)效率都幾乎相同,在10億這個(gè)級(jí)別,gcc也不過有時(shí)快0.1秒而已,而且多次運(yùn)行,還不是太穩(wěn)定??磥聿⒉皇菑?fù)雜的實(shí)現(xiàn)就一定好。。。
相關(guān)函數(shù):
msdn:
Converts characters.
int __toascii(
int c
);
這個(gè)函數(shù)也是一個(gè)雙前置下劃線的函數(shù),MS,gcc中都有實(shí)現(xiàn)。而且在此時(shí),實(shí)現(xiàn)都是一樣的。
#define __toascii(_Char) ( (_Char) & 0x7f )
gcc注釋到 “mask off high bits.”
這里和gcc中__isascii函數(shù)實(shí)現(xiàn)的前一部分很像,一個(gè)是去除低七位,一個(gè)是保留低七位??戳诉@個(gè)以后才知道gcc為什么想到這樣實(shí)現(xiàn)__isascii了。
考試大提示:這兩個(gè)函數(shù)在實(shí)際中我從來沒有用到過,假如不是我工作范圍太窄那就是這兩個(gè)函數(shù)的使用性并不強(qiáng)了,的確,我沒有事去把一個(gè)值轉(zhuǎn)為ascii?是ascii的話就沒有意義,不是的話,原來的含義還能保留嗎?至于__isascii函數(shù)可能還在某些情況下有用吧,只不過我沒有用到過,誰有實(shí)際中使用此兩個(gè)函數(shù)的代碼可以告訴我一下。
考試大總結(jié)的是,雖然C Runtime庫MS也有源碼,但是完全沒有任何注釋。相對(duì)而言gcc的注釋就算是很豐富和詳細(xì)了,呵呵,畢竟開源代碼就是不一樣啊,做來就是給人看的,想想這樣分析下去,光是看源代碼收獲都不會(huì)太小。
int __isascii(
int c
);
int iswascii(
wint_t c
);
測(cè)試程序:
#include "stdafx.h"
#include "ctype.h"
#include "locale.h"
#include "stdio.h"
void CheckCharAndPrint(char acChar)
{
if(__isascii(acChar))
{
printf("char %c is a ascii char.\n",acChar);
}
else
{
// 此處無法正常輸出中文,沒有深入研究了
printf("char %c is not a ascii char.\n",acChar);
}
}
void CheckWCharAndPrint(wchar_t awcChar)
{
if(iswascii(awcChar))
{
wprintf(L"wchar %c is a ascii char.\n",awcChar);
}
else
{
setlocale(LC_ALL,"");
wprintf(L"wchar %c is not a ascii char.\n",awcChar);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char lcC = 'a';
char lcD = '中';
CheckCharAndPrint(lcC);
CheckCharAndPrint(lcD);
wchar_t lwcC = L'a';
wchar_t lwcD = L'中';
CheckWCharAndPrint(lwcC);
CheckWCharAndPrint(lwcD);
return 0;
}
說明:
__isascii是一個(gè)比較特殊的函數(shù),因?yàn)樗詢蓚€(gè)前置下劃線開頭。這在C語言中并不多見。(起碼我看到的比較少)
此函數(shù)應(yīng)該不屬于標(biāo)準(zhǔn)庫函數(shù),《TCPL》中,《C語言參考》中并沒有描述,但是gcc中有此函數(shù)。也就是說linux下也能正常使用此函數(shù)。
iswascii這個(gè)__isascii函數(shù)的寬字節(jié)版本,如同很多寬字節(jié)版本的函數(shù)一樣,這個(gè)函數(shù)屬于MS自己擴(kuò)的,于是。。linux下無法使用此函數(shù),要使用,只能自己實(shí)現(xiàn)羅。
實(shí)現(xiàn):
MS:
#define __isascii(_Char) ( (unsigned)(_Char) < 0x80 )
inline int __cdecl iswascii(wint_t _C) {return ((unsigned)(_C) < 0x80); }
gcc:
#define __isascii(c) (((c) & ~0x7f) == 0) /* if C is a 7 bit value*/
__isascii都是一個(gè)簡(jiǎn)單的宏。MS的iswascii原理和其__isascii都一樣,僅僅是一個(gè)內(nèi)聯(lián)的函數(shù)。
微軟的實(shí)現(xiàn)是依賴于字符小于128(0x80),這里還做了一次強(qiáng)轉(zhuǎn),不是太理解,因?yàn)閷?shí)際char可以直接作為整數(shù)來比較,也許僅僅是為了屏蔽warning?
gcc的實(shí)現(xiàn)是依賴于字符除低七位外無任何其他值。即先將127(0x7f)取反,再與字符位與。實(shí)際就是取得字符c除了低七位以外的值。再比較此值是否為零。
想不到一個(gè)這樣簡(jiǎn)單的函數(shù),MS,gcc的實(shí)現(xiàn)差別都這么大,相對(duì)而言MS的實(shí)現(xiàn)自然是比較淺顯易懂的,但是gcc用這么復(fù)雜的實(shí)現(xiàn),應(yīng)該有更好的效率。
就分析而言,強(qiáng)轉(zhuǎn)+小于操作 運(yùn)行時(shí)間大于 一次取反一次位與一次等于操作。還真不容易知道誰的效率真的更高。那么就測(cè)試一下吧
效率測(cè)試:
#include "jtianling.h"
#define __isasciims(_Char) ( (unsigned)(_Char) < 0x80 )
#define __isasciigcc(c) (((c) & ~0x7f) == 0) /* if C is a 7 bit value*/
const int DEF_TEST_TIMES = 1000000000;
void CheckMS(char ac)
{
double ldTimeLast = jtianling::GetTime();
for (int i=0; i
__isasciims(ac);
}
double ldTimePast = jtianling::GetTime() - ldTimeLast;
printf("__isasciims %c run %d times cost %lf secs.\n", ac, DEF_TEST_TIMES, ldTimePast);
}
void Checkgcc(char ac)
{
double ldTimeLast = jtianling::GetTime();
for (int i=0; i
__isasciigcc(ac);
}
double ldTimePast = jtianling::GetTime() - ldTimeLast;
printf("__isasciigcc %c run %d times cost %lf secs.\n", ac, DEF_TEST_TIMES, ldTimePast);
}
int _tmain(int argc, _TCHAR* argv[])
{
char lc = 'a';
char lc2 = '中';
CheckMS(lc);
Checkgcc(lc);
CheckMS(lc);
Checkgcc(lc2);
return 0;
}
至于GetTime函數(shù)的意義,請(qǐng)參考我以前寫的庫,無非就是獲取當(dāng)前時(shí)間,不知道也沒有關(guān)系。你可以用time(NULL)來替代,只不過精度沒有這個(gè)函數(shù)高而已。
實(shí)際的測(cè)試結(jié)果很讓人失望,在測(cè)試了幾乎無數(shù)次以后,MS和gcc的實(shí)現(xiàn)效率都幾乎相同,在10億這個(gè)級(jí)別,gcc也不過有時(shí)快0.1秒而已,而且多次運(yùn)行,還不是太穩(wěn)定??磥聿⒉皇菑?fù)雜的實(shí)現(xiàn)就一定好。。。
相關(guān)函數(shù):
msdn:
Converts characters.
int __toascii(
int c
);
這個(gè)函數(shù)也是一個(gè)雙前置下劃線的函數(shù),MS,gcc中都有實(shí)現(xiàn)。而且在此時(shí),實(shí)現(xiàn)都是一樣的。
#define __toascii(_Char) ( (_Char) & 0x7f )
gcc注釋到 “mask off high bits.”
這里和gcc中__isascii函數(shù)實(shí)現(xiàn)的前一部分很像,一個(gè)是去除低七位,一個(gè)是保留低七位??戳诉@個(gè)以后才知道gcc為什么想到這樣實(shí)現(xiàn)__isascii了。
考試大提示:這兩個(gè)函數(shù)在實(shí)際中我從來沒有用到過,假如不是我工作范圍太窄那就是這兩個(gè)函數(shù)的使用性并不強(qiáng)了,的確,我沒有事去把一個(gè)值轉(zhuǎn)為ascii?是ascii的話就沒有意義,不是的話,原來的含義還能保留嗎?至于__isascii函數(shù)可能還在某些情況下有用吧,只不過我沒有用到過,誰有實(shí)際中使用此兩個(gè)函數(shù)的代碼可以告訴我一下。
考試大總結(jié)的是,雖然C Runtime庫MS也有源碼,但是完全沒有任何注釋。相對(duì)而言gcc的注釋就算是很豐富和詳細(xì)了,呵呵,畢竟開源代碼就是不一樣啊,做來就是給人看的,想想這樣分析下去,光是看源代碼收獲都不會(huì)太小。