なんだこれは

はてなダイアリーから移転しました。

if にできなくて switch にできること

C言語 Advent Calendar 2016を書く人が少ないので5日目に飛びいり参加しました。

さて switch 文は if で置き換えられるからいらない子と思われているかもしれませんがif文で実現できない、switch 文というものが実はあります。

それはループへの割り込みです。
forループ中に case句をわりこませてみましょう。

#include <stdio.h>

int main(int argc, char *argv[]){
  int t = 0;
  switch (t){
    for(int j=0;j<3;j++){
  case 1:
    printf("t=1 :%d\n",j);
  case 0:
    printf("t=0 :%d\n",j);
    }
  }
  return 0;
}

これは case が ラベルであって、文ではないからです。
構造化プログラミング以前に文法がつくられただけはありますね。

どう有効利用する文法なんでしょうかね。

では、gccコンパイルし実行してみます。

gcc --version

gcc (MacPorts gcc5 5.4.0_0) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gcc -Wall -Wextra test1.c -o testgcc5.o
./testgcc.5.o

t=0 :1
t=1 :2
t=0 :2

では、clangでもコンパイルと実行をしてみます。

clang --version

Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

clang test1.c -o testclang.o
./testclang.o

t=0 :0
t=1 :1
t=0 :1
t=1 :2
t=0 :2

あれれ?