Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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/
のパロディです。

Nabetani
横浜へなちょこプログラミング勉強会をやっていました。 / CodeIQ の出題者でした。 / 日経 WinPC に連載を持っていました(名義が違うけど) / Yokohama rb に半分ぐらい参加しています。 / twitter : http://twitter.com/Nabetani
https://nabetani.hatenadiary.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした