LoginSignup
155
136

More than 5 years have passed since last update.

C++ の、スマートだと思う人がいるかもしれないコードの書き方12選のつもりが6個ぐらいで断念

Last updated at Posted at 2014-08-13

1. 括弧の省略

if, while, for の括弧を省略する人はたくさんいるけど、switch も省略できるよ。

c++
#include <iostream>
using namespace std;

char const * less_bracket(int n)
{
  switch(n)
  if(false)
  case 0: return "zero";
  else if(true)
  case 1: return "one";
  else
  case 2: return "two";
}

int main()
{
  cout
  << less_bracket(0)<<" "
  << less_bracket(1)<<" "
  << less_bracket(2);
}
// 「zero one two」と出力

2.三項演算子

三項演算子は、左辺値でも使えるよ。

c++
#include <iostream>

int main()
{
  int a=1, b=2;
  (a<b ? a : b)= 3;
  std::cout << a << " " << b; // 「3 2」と出力
}

3.switch文

複雑な条件は switch 文とループを組み合わせると短く書けることがあるよ。

c++
#include <iostream>

int main()
{
  for( int i=1 ; i<5 ; ++i )
    switch(int j=i)
      default:{
        std::cout<<"z";
        case 2:
        for(j=0;j<5;++j){
          case 3:
          std::cout<<j;
          case 1:;
        }
      }
}
// 「2340123434z01234」と出力

4.for文

for 文は、initlaizer_list と組み合わせると便利。

c++
#include <iostream>
#include <initializer_list>

int main()
{
  for( char const * c : { "foo", "bar", "baz" } ){
    std::cout <<"["<<c<<"]";
  }
}
// 「[foo][bar][baz]」と出力

5.変数宣言のみで配列への要素追加

思いつかない。ぐぬぬ。

と書いていたんだけど、@T_MURACHI 様 のアイディアから着想を得て。

C++ の配列は要素を増やすことは出来ないけど、一部の要素を書くだけで他の要素に値を入れることならできる場合があるよ。

c++
#include <iostream>

int main()
{
  int a[3]{ (a[2]=(a[1]=1)*10)*20 };
  for( auto i : a ) std::cout << i << " ";
}
// 処理系によっては「200 1 10 」と出力

c99 の 指示初期化子 と組み合わせるとさらに強力!

6.引数のデフォルト値

引数のデフォルト値に、副作用のある式を書くと呼ぶたびに実行されて便利。

c++
#include <iostream>

int max( int a, int b ){  return a<b ? b : a;  }

int main()
{
    int max(int, int=3+!(std::cout<<","));
    for( int i=0 ; i<10 ; ++i )std::cout<<max(i);
}
// 処理系によっては「,3,3,3,3,4,5,6,7,8,9」と出力

7.関数でのglobal宣言

関数のデフォルト引数の宣言にはグローバル変数が使えるよ。

c++
#include <iostream>

int g;
int max( int a, int b=g ){  return a<b ? b : a;  }

int main()
{
  for( g=0;g<4;++g){
    for(int x=0;x<4;++x )std::cout<<max(x);
    std::cout<<" ";
  }
}
// 「0123 1123 2223 3333 」と出力

ちょっとタイトルと合わないか。

8.条件式での変数定義

for 文の冒頭で変数を宣言する人が多いけど、if, switch, while でも宣言できるよ。便利。

c++
#include <iostream>
#include <cstring>
#include <initializer_list>

int main()
{
  for( char const * c : { "foo", "bar", "baz", "hoge", "fuga" } ){
    if ( char const * a=strchr( c, 'a' ) )
      std::cout << a;
    else
      std::cout<< c;
    std::cout <<" ";
  }
}
// 「foo ar az hoge a 」と出力

9.まとめ

以上は基本的なものもあるけど、どれも最大限活用すると、なにかが起こるかもしれないよ。
初心者のかたは結構知らないものが多いかもしれないけど、コーディング時間短縮以外の何かのために覚えておくと損しないかもね。

本当は 12 まであるはずだったんだけど、ネタ切れ。
すいません。

5番とまとめに追記しましたよ。

念の為に書いておくと、
http://megalodon.jp/2014-0812-0928-28/bulkserver.jp/blog/2014/08/07/php-code/
のパロディです。

155
136
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
155
136