三項演算子の振る舞い

実は最近調子が悪く、療養中の身で最近記事をかけていません。(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ずつ増えていきます。理由はわかりませんが、リロードの前に無駄な読み込みでもしているんでしょうか。それとも?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)