2005 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
2014 1 2 3 4 5 6 7 8 9 10 11 12
2015 1 2 3 4 5 6 7 8 9 10 11 12
2016 1 2 3 4 5 6 7 8 9 10 11 12
2017 1 2 3 4 5 6 7 8 9 10

ホーム

2011年02月19日

C++での話。

  #include <iostream>
  
  using namespace std;
  
  class Foo {
  public:
      Foo operator+(const Foo& obj) {
          cout << "+";
          return Foo();
      }
      Foo operator*(const Foo& obj) {
          cout << "*";
          return Foo();
      }
  };
  
  int
  main()
  {
      Foo f, g, h;
      f + g * h;
      cout << endl;
      return 0;
  }

当たり前だけど、出力は「*+」になる。かけ算が先に
評価される。

  #include <iostream>
  
  using namespace std;
  
  bool
  return_true()
  {
      cout << "t";
      return true;
  }
  
  bool
  return_false()
  {
      cout << "f";
      return false;
  }
  
  int
  main()
  {
      return_true() || return_false() && return_false();
      cout << endl;
      return 0;
  }

これは「t」とだけ出力される。

あまり意識されないんだけど、&& と || とでは優先順位が
異なる。&& のほうが強い。だから、上の式は:

    return_true() || (return_false() && return_false());

という結合になる。だから、演算子の左辺が先に実行
されて「t」が出力される。

でも、優先順位が異なるのは、+ と * でも同じこと。
それなのに、+ と * では * のほうが先に評価される。

上で「当たり前だけど」と書いたけど、実はこれは当たり前
ではないらしい。論理演算子は左辺から評価されると
規定されているけど、算術演算子の評価順序は規定されて
いないらしい。だから、最初の出力が「*+」となるのは、
実は実装依存らしい。

演算子の優先順位というのは、結合の優先順位ということで、
評価の順序とは関係ない。で、多くの演算子の評価順序は
実は規定されていないらしい。評価順序が規定されている
演算子は、論理演算子の他には条件演算子(三項演算子)と
カンマ演算子しかないらしい:

http://www.tamasoft.co.jp/lc/hlp/F038.html
http://msdn.microsoft.com/ja-jp/library/2bxt6kc4.aspx

本家Permlink


2011年02月05日

HHKとかFILCOのヤツとかの『こんな商品も』がピンポイントすぎる。

本家Permlink


Copyright © 1905 tko at jitu.org

バカが征く on Rails