switch caseで変数を定義する方法(カッコを使用しない)
今週末、久しぶりに何人かの友达(毎日/ディディ/丁丁)に会って、みんなで何かあったかを話して、とても森を開いています!
毎日私の1つの問題を試験して、C言語の中で、どのようにswitch caseの中で1つの変数を定義しますか?要件はカッコを使わないことです.
この問題は背景にあり,caseの後ろで変数を直接定義できないため,次のコードはコンパイルできない.
毎日私にどんな特殊な技でこのコンパイルミスを解消することができますか?(カッコを付けてはいけません)
答えはなんと
に改心
セミコロンをつけるのは面白いと思いますか?姉のことを考えられないのではないでしょうか.(どうせ私は)
毎日私に以前意識したことのない問題を話してくれました.caseとdefaltは実はラベルで、そういえばダフ設備の動作原理が一気に分かりました(古くからダフ設備を知っていましたが、悟りませんでした)
Wikipediaにはダフ設備の紹介がありますhttp://zh.wikipedia.org/wiki/%E8%BE%BE%E5%A4%AB%E8%AE%BE%E5%A4%87
C 99標準を出して勉強しましたラベルのバコス様式:
(6.8.1) labeled-statement:
identifier : statement
case constant-expression : statement
default : statemen
毎日言うようにcaseもdefaultもラベルです.
ではstatementのバコス様式はどうなっているのでしょうか.
(6.8) statement:
labeled-statement
compound-statement
expression-statement
selection-statement
iteration-statement
jump-statement
ラベルの後ろにはほとんど何でもいいですが、declaration expression(変数を定義する式)だけではいけません.
つまり、このようにすることができます
そんなことはできない
上の書き方はラベルのバコス様式に合わないので、コンパイラは文法分析をするときに間違っています.
しかし、いったん書くと
コンパイルはパスしました.セミコロンは空の文として、ラベルのバコスのパターンに完全に合っています.
この文章の話は1/3にすぎないが、なぜラベルの後ろ(直後)に変数を定義できないのか.C++はどうですか?読者に自分で考えて実験してください.私はレンガを投げるだけです.
今日は冬至で、眠くて、書きません.
毎日私の1つの問題を試験して、C言語の中で、どのようにswitch caseの中で1つの変数を定義しますか?要件はカッコを使わないことです.
この問題は背景にあり,caseの後ろで変数を直接定義できないため,次のコードはコンパイルできない.
switch (v) {
case 1:
int a;
get_value_of_xx(&a);
set_yy(a);
break;
case 2:
//do_sth
break;
defalut:
break;
}
毎日私にどんな特殊な技でこのコンパイルミスを解消することができますか?(カッコを付けてはいけません)
答えはなんと
case 1:
に改心
case 1:;
セミコロンをつけるのは面白いと思いますか?姉のことを考えられないのではないでしょうか.(どうせ私は)
毎日私に以前意識したことのない問題を話してくれました.caseとdefaltは実はラベルで、そういえばダフ設備の動作原理が一気に分かりました(古くからダフ設備を知っていましたが、悟りませんでした)
Wikipediaにはダフ設備の紹介がありますhttp://zh.wikipedia.org/wiki/%E8%BE%BE%E5%A4%AB%E8%AE%BE%E5%A4%87
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7) / 8;
switch(count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while(--n > 0);
}
}
C 99標準を出して勉強しましたラベルのバコス様式:
(6.8.1) labeled-statement:
identifier : statement
case constant-expression : statement
default : statemen
毎日言うようにcaseもdefaultもラベルです.
ではstatementのバコス様式はどうなっているのでしょうか.
(6.8) statement:
labeled-statement
compound-statement
expression-statement
selection-statement
iteration-statement
jump-statement
ラベルの後ろにはほとんど何でもいいですが、declaration expression(変数を定義する式)だけではいけません.
つまり、このようにすることができます
case 1:
{
int a;
}
そんなことはできない
case 1:
int a;
上の書き方はラベルのバコス様式に合わないので、コンパイラは文法分析をするときに間違っています.
しかし、いったん書くと
case 1:;
int a;
コンパイルはパスしました.セミコロンは空の文として、ラベルのバコスのパターンに完全に合っています.
この文章の話は1/3にすぎないが、なぜラベルの後ろ(直後)に変数を定義できないのか.C++はどうですか?読者に自分で考えて実験してください.私はレンガを投げるだけです.
今日は冬至で、眠くて、書きません.