0

プログラムが期待どおりに動作するようになりましたが、それがどのように機能するかを誰か説明できますか?

#include <iostream>

using namespace std;

int main(void) {
    int exit;     
    string name;
    cin >> name;

    for (int i = 0; i < name.length(); i++) {
        // the line below is the one I don't understand 
        if ('a' <= name[i] && name[i] <= 'z') name[i] = char(((int)name[i]) - 32);
    }
    cout << name;
    cin >> exit;
    return 0;
 }

編集:言い換えさせてください:

私が理解していないのは、次のように、文字列から配列への取引がどのように機能するかです 'a'<= name[i]。これは正確に何をどのように比較しますか?

EDIT2 迅速な対応に感謝します。みんな大好きです。私はそれを考え出した。

4

5 に答える 5

3

これは行です:

 if('a'<=name[i] && name[i]<='z')name[i]=char(((int)name[i])-32);

分解:

 if( 'a'<=name[i] ) {
   if( name[i]<='z' ) {
     // name_int is a temporary, which the above code implicitly creates,
     // but doesn't give a name to:
     int name_int = name[i];
     name_int = name_int - 32;
     name[i] = char(name_int);
   }
 }

使用している文字エンコーディングが32たまたま等しいことに注意してください。'a'-'A'

(技術的name_intには、int&&またはそのようなものである必要がありますが、それほど混乱する必要はありません。)

于 2013-01-24T22:13:17.307 に答える
2

あなたのコメントの編集[]から、オブジェクトにどのように適用できるか疑問に思っていると思いstringます。演算子は、表現された文字列の指定された位置オフセットにある文字への参照を返す[]ためにオーバーロードされます。を配列にstring直接変換する必要はありません。stringオーバーロードを実装するコードは、リンクされたリストを歩いている可能性があります。実装方法によって異なりますstring

于 2013-01-24T22:25:00.427 に答える
1
'a' <= name[i] && name[i] <= 'z'

この行は、これら2つの文字の対応するASCII値を比較しています。'a'ASCIIでは97、122です。からの文字の1つである'z'場合、式はtrueを返します。これは通常、変数がアルファベットかどうかを確認するために使用されます。name[i]'a''z'

于 2013-01-24T22:22:38.550 に答える
1

小文字から大文字に変換するには、元の ASCII 値から 32 を引いた ASCII 文字形式を想定しています。これは、大文字の ASCII 値が小文字の ASCII 値よりも小さく、 と の間の一定の差などAであるためです。aBb

参考:http ://www.asciitable.com/

于 2013-01-24T22:11:57.113 に答える
0
if ('a' <= name[i] && name[i] <= 'z')

charオブジェクトは int に似た数値です。の数値が調べている文字以下'a' <= name[i]かどうかをテストするだけです。'a'and と組み合わせて、 の数値がとの値の間にあるname[i] <= 'z'かどうかをテストします。さて、 「情報交換のための米国標準コード」(ASCII) と名付けられた、数値を s に割り当てるための最も一般的なスキームでは、アルファベットが順番に並べられています。、など。したがって、文字が と の間にあるかどうかを調べると、それが小文字かどうかがわかります。name[i]'a''z'char'a' + 1 = 'b''b' + 1 = 'c''a''z'

name[i] = char(((int)name[i]) - 32);

chars が単なる数値であることがわかったら、小学校で学んだ算術の基本的な特性から推論して、'a' + ('A' - 'a')結果が value になる可能性があります'A'。さらに、ASCII では大文字のアルファベットが小文字のアルファベットと同様に配置されているため、'A' + 1= 'B' , etc. So taking anychar in the lower case alphabet and adding'A' - 'a' will result in the upper case version of that letter. In ASCII'A' - 'a'` の値はたまたま -32 になります。小文字の数値から 32 を引くと、大文字の値が得られます。

比較のために、ASCII に依存しないバージョンのコードを次に示します。

auto l = std::locale();

if (std::islower(name[i], l))
    name[i] = std::tolower(name[i], l);
于 2013-01-24T22:48:07.350 に答える