KTN19 さんが書きました:
コード:
char turn( char c )
{
char big[ 26 ] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char small[ 26 ] = "abcdefghijklmnopqrstuvwxyz";
int i;
for( i = 0; big[ i ] != '\0'; i++ ){
if( big[ i ] == c ) return small[ i ];
}
return c;
}
turn() ですが、1文字ごとに for文でループを回るのは、
ちょっと効率が悪いと思います。
次のように書けば、文字コードが EBCDIC のように、
'A' から 'Z' までが連続していなくても OK です。
コード:
char turn( char c )
{
switch (c) {
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':
case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':
case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':
case 'V': case 'W': case 'X': case 'Y': case 'Z': return c - 'A' + 'a';
}
return c;
}
コンパイル結果もリーズナブルです。
コード:
C:\tmp>gcc -c -O2 turn.c
C:\tmp>objdump -d turn.o
turn.o: file format pe-x86-64
Disassembly of section .text:
0000000000000000 <turn>:
0: 8d 51 bf lea -0x41(%rcx),%edx
3: 8d 41 20 lea 0x20(%rcx),%eax
6: 80 fa 19 cmp $0x19,%dl
9: 0f 47 c1 cmova %ecx,%eax
c: c3 retq
d: 90 nop
e: 90 nop
f: 90 nop
C:\tmp>cl -c -O2 turn.c
Microsoft(R) C/C++ Optimizing Compiler Version 18.00.31101 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
turn.c
C:\tmp>dumpbin -disasm turn.obj
Microsoft (R) COFF/PE Dumper Version 12.00.31101.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file turn.obj
File Type: COFF OBJECT
_turn:
00000000: 8A 4C 24 04 mov cl,byte ptr [esp+4]
00000004: 8D 41 BF lea eax,[ecx-41h]
00000007: 3C 19 cmp al,19h
00000009: 77 07 ja 00000012
0000000B: 0F BE C1 movsx eax,cl
0000000E: 83 C0 20 add eax,20h
00000011: C3 ret
00000012: 8A C1 mov al,cl
00000014: C3 ret
Summary
10 .debug$F
60 .debug$S
2F .drectve
15 .text$mn
C:\tmp>