趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • 三項演算子の振る舞い

    投稿日 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ずつ増えていきます。理由はわかりませんが、リロードの前に無駄な読み込みでもしているんでしょうか。それとも?


    コメントをどうぞ(日本語のみ/Only in Japanese)

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