7.17知識のまとめ
2823 ワード
一、sscanf文
まず(最も一般的な場合)コードの表示:
その出力結果はbcd
最初の「」にはターゲット文字列が格納され、最後の結果文字列はこれにのみ関連します.
2番目の「」は、フォーマットおよび特殊な要件を制御し、1番目の%*は、1つの*が占める文字、すなわちbから読み書きを無視することを示す.2番目の%3 sは文字列形式で、長さは3です.
変式します:sscanf(“abcdeff”,“%2[a-c]s”,arry);
その出力結果はab
このうち2[a-c]は,a,b,cの3文字であれば,長さが2であることを表す.
ただし、sscanfは左から右へ順に読み書き操作を行い、読み出されたターゲット文字列のいずれかの文字が特殊な要求に合致しないと、すぐに停止することに注意してください.
例えば、sscanf(「ddddddeff」,「%2[a-c]s」,arry);その出力結果,(何もない)上位2位にabcはない.
例えば、sscanf(「ddedeff」,「%5[a-d]s」,arry);その出力結果,ddが3番目に読み出された場合,eはabcdに属さず,要求に合致せず,直ちに読み書きを停止する.
二、printf文
printfの戻り値は出力される文字数です
Part A:
テストコード実装:
実行結果:4321
どんな問題を説明できますか.
①printfという関数は、先に後の部分を実行するので、先に43を印刷し、後に2を印刷してから1を印刷します.
②printfの戻り値は、出力される文字の個数である「」のうち、フォーマット制御部を除いた文字の個数であるが、なぜ太字であることを強調するのか.
例えば、printf("%d|",printf("%d|",printf("%d",a)));//区切り文字でその部分を見て先に走ったつもりが、うまくいかずにこの穴を見つけた
その出力結果は、432|2|なぜ最後の数が1ではないのか、前のprintfは2という数だけでなく'|'も印刷したので、これは2つの記号なので、2は1ではありません.
三、マクロ定義の進級
テストコードは次のとおりです.
その演算結果は:12 f(1,2)
まず、演算記号について説明します.
#a:aを文字列にします.例えば、#1は整数の1を“1”にします.それだけでなく、#の後ろのすべてを文字型にし、無条件に変換し、関数でも文字列にします.
a##b:abを繋ぐ
次に、マクロ定義を説明します.
#define f(a,b)a##b#define g(a)#aどちらも演算のマクロ定義
#define h(a)g(a)これは関数のマクロ定義であり、その演算法則は、パラメータを置き換えてから関数を置き換える必要がある
正確にはh(a)という関数のマクロ定義です
次に、演算結果を説明します.
12:1と2は先に12になる(整数型の12であり、printf("%d",f(1,2)−2を通過することができる).検証、発見は10)持ち込みはg(a)が2文字12になった後に印刷されます.//演算法則に注意彼の外関数はマクロ定義関数だから
f(1,2):外関数はg(a)演算のマクロ定義であり、直接g(a)を実行することは、f(a,b)を文字型にして印刷することである.
四、一つのプログラムの実行手順
一つだけcファイルは、ヘッダファイルの付加、マクロ定義の置換を含むプリプロセッサによって前処理される.(文法チェックなし!!)main.iファイルに変更し、コンパイラでmain.sファイルにコンパイルし、期間を最適化して文法チェック機能を行い、コンパイラでmain.oファイルをアセンブリして生成し(マシンコードを生成)、最後にリンク、リンク完了後にコードを飛び出し、リンクプロセスにはヘッダーファイルを関連付けるなどが含まれます.
一つ差し込む
テストコード実装:
実行結果:4 10(無視)
分析:printfはリンクが完了してから実行を開始し、つまり実行段階で実行を開始するが、sizeofはコンパイル段階で完了し、つまりコンパイルが完了した後に文がprintfになった("%d",4);i++の操作はまったく行われていないのでprintfから出てきたiはまだ10です.
まず(最も一般的な場合)コードの表示:
char arry[100];
int main(){
sscanf("abcdeff","%*c%3s",arry);
printf("%s",arry);
return 0;
}
その出力結果はbcd
最初の「」にはターゲット文字列が格納され、最後の結果文字列はこれにのみ関連します.
2番目の「」は、フォーマットおよび特殊な要件を制御し、1番目の%*は、1つの*が占める文字、すなわちbから読み書きを無視することを示す.2番目の%3 sは文字列形式で、長さは3です.
変式します:sscanf(“abcdeff”,“%2[a-c]s”,arry);
その出力結果はab
このうち2[a-c]は,a,b,cの3文字であれば,長さが2であることを表す.
ただし、sscanfは左から右へ順に読み書き操作を行い、読み出されたターゲット文字列のいずれかの文字が特殊な要求に合致しないと、すぐに停止することに注意してください.
例えば、sscanf(「ddddddeff」,「%2[a-c]s」,arry);その出力結果,(何もない)上位2位にabcはない.
例えば、sscanf(「ddedeff」,「%5[a-d]s」,arry);その出力結果,ddが3番目に読み出された場合,eはabcdに属さず,要求に合致せず,直ちに読み書きを停止する.
二、printf文
printfの戻り値は出力される文字数です
Part A:
テストコード実装:
int main() {
int a=43;
printf("%d",printf("%d",printf("%d",a)));
return 0;
}
実行結果:4321
どんな問題を説明できますか.
①printfという関数は、先に後の部分を実行するので、先に43を印刷し、後に2を印刷してから1を印刷します.
②printfの戻り値は、出力される文字の個数である「」のうち、フォーマット制御部を除いた文字の個数であるが、なぜ太字であることを強調するのか.
例えば、printf("%d|",printf("%d|",printf("%d",a)));//区切り文字でその部分を見て先に走ったつもりが、うまくいかずにこの穴を見つけた
その出力結果は、432|2|なぜ最後の数が1ではないのか、前のprintfは2という数だけでなく'|'も印刷したので、これは2つの記号なので、2は1ではありません.
三、マクロ定義の進級
テストコードは次のとおりです.
#include
#define f(a,b) a##b#
define g(a) #a#
define h(a) g(a)
int main(){
printf("%s
",h(f(1,2)));printf("%s
",g(f(1,2)));
return 0;
}
その演算結果は:12 f(1,2)
まず、演算記号について説明します.
#a:aを文字列にします.例えば、#1は整数の1を“1”にします.それだけでなく、#の後ろのすべてを文字型にし、無条件に変換し、関数でも文字列にします.
a##b:abを繋ぐ
次に、マクロ定義を説明します.
#define f(a,b)a##b#define g(a)#aどちらも演算のマクロ定義
#define h(a)g(a)これは関数のマクロ定義であり、その演算法則は、パラメータを置き換えてから関数を置き換える必要がある
正確にはh(a)という関数のマクロ定義です
次に、演算結果を説明します.
12:1と2は先に12になる(整数型の12であり、printf("%d",f(1,2)−2を通過することができる).検証、発見は10)持ち込みはg(a)が2文字12になった後に印刷されます.//演算法則に注意彼の外関数はマクロ定義関数だから
f(1,2):外関数はg(a)演算のマクロ定義であり、直接g(a)を実行することは、f(a,b)を文字型にして印刷することである.
四、一つのプログラムの実行手順
一つだけcファイルは、ヘッダファイルの付加、マクロ定義の置換を含むプリプロセッサによって前処理される.(文法チェックなし!!)main.iファイルに変更し、コンパイラでmain.sファイルにコンパイルし、期間を最適化して文法チェック機能を行い、コンパイラでmain.oファイルをアセンブリして生成し(マシンコードを生成)、最後にリンク、リンク完了後にコードを飛び出し、リンクプロセスにはヘッダーファイルを関連付けるなどが含まれます.
一つ差し込む
テストコード実装:
int main(){
int i=10;
printf("%d
",sizeof(i++)); //sizeof 。
printf("%d
",sizeof i++ );
printf("%d",i);
return 0;
}
実行結果:4 10(無視)
分析:printfはリンクが完了してから実行を開始し、つまり実行段階で実行を開始するが、sizeofはコンパイル段階で完了し、つまりコンパイルが完了した後に文がprintfになった("%d",4);i++の操作はまったく行われていないのでprintfから出てきたiはまだ10です.