2015年7月7日火曜日

三項演算子の振る舞い

実は最近調子が悪く、療養中の身で最近記事をかけていません。(ESP8266関係も追っかけられていません)
ただ、Webを彷徨っていたらこんな記事を見かけたので考えてみました。
i%n==0?1:0
ってどんな意味?
との質問。演算子の優先順位から言って、((i%n)==0)?1:0 と等価で、iがnの倍数の時に1になる動きをするのでしょう。
実際にいくつかの言語で試してみました。

1.C言語

#include <stdio.h>
int main(int argc,char *argv[])
{
 int n=5;
 for(int i=0;i<20;i++)
  printf("%d %d\n",i,i%n==0?1:0);
}
となります。コンパイルと実行結果は、
$ gcc foobar.c -o foobar -std=c99
$ ./foobar 
0 1
1 0
2 0
3 0
4 0
5 1
6 0
7 0
8 0
9 0
10 1
11 0
12 0
13 0
14 0
15 1
16 0
17 0
18 0
19 0

2.Java言語

public class foobar {
 public static void main(String[] args) {

  int n=5;
  for(int i=0;i<20;i++){
   System.out.println(i+" "+(i%n==0?1:0) );
  }
 }
}
コンパイルと実行は、
$ sudo apt-get install default-jdk
$ javac foobar.java 
$ java foobar 
0 1
1 0
2 0
3 0
4 0
5 1
6 0
7 0
8 0
9 0
10 1
11 0
12 0
13 0
14 0
15 1
16 0
17 0
18 0
19 0
となります。

3.JavaScript言語(Node.js 環境)

n=5;
for(i=0;i<20;i++){
 console.log(i+" "+(i%n==0?1:0))
}
実行は、
$ nodejs foobar-node.js
0 1
1 0
2 0
3 0
4 0
5 1
6 0
7 0
8 0
9 0
10 1
11 0
12 0
13 0
14 0
15 1
16 0
17 0
18 0
19 0

4.JavaScript(ブラウザ環境)

n=5;
for(i=0;i<20;i++){
 document.writeln(i+" "+(i%n==0?1:0)+"<BR>")
}
ブラウザでからのページを開いて、右クリックでJavaScriptコンソールを開いて、上記のプログラムをコピペしてリターンキーを押すと、結果がブラウザ側に表示されます。

5.JavaScript(おまけ)

サーバサイドで実行して、ブラウザで結果を見る場合です。
var http = require('http');

var n=0;
 
var server = http.createServer();
server.on('request', doRequest);
server.listen(8000);
console.log('Server running at http://127.0.0.1:8000/');

function doRequest(req,res){
 res.writeHead(200, {'Content-Type': 'text/plain'});
 n=n+1
 res.write("Try #"+n+"\n");
 for(i=0;i<45;i++){
  res.write(i+" "+(i%n==0?1:0)+"\n");
 }
 res.end('Completed\n');
}
これを foobar-server.js で保存して
$ nodejs foobar-server.js
で実行し、ブラウザで http://localhost:8000/ を表示すると結果が見れます。
firefoxではリロード毎にちゃんとnが1ずつ増えていくのですが、Chromeだと1から始まって2ずつ増えていきます。理由はわかりませんが、リロードの前に無駄な読み込みでもしているんでしょうか。それとも?

0 件のコメント: