C/C++のカンマ演算子とは?セパレータと演算子としての違いを実例で解説
はじめに
C/C++プログラミングにおけるカンマ(,)は、文脈によって2つの異なる役割を持つ特殊な記号です。
セパレータ(区切り文字)として — 変数の宣言や関数の引数リストなどで、複数の要素を区切るために使用されます。
演算子として — カンマ演算子は二項演算子であり、左辺の式を評価した後にその値を破棄し、右辺の式の値を結果として返します。すべての演算子の中で最も優先順位が低いという特徴があります。
以下のコード例を見て、それぞれの出力結果を予想してみてください。
例1:宣言時にカンマを使った場合
#include <stdio.h>
int main(void) {
char ch = 'a', 'b', 'c';
printf("%c", ch);
return 0;
}出力結果
このコードはコンパイルエラーになります。変数宣言文の中のカンマはセパレータとして機能するため、「'b'」のようなリテラルを続けて書くことは許されません。
prog.c: In function 'main':
prog.c:5:20: error: expected identifier or '(' before 'b'
char ch = 'a', 'b', 'c';
^~~例2:代入文でカンマを使った場合
#include <stdio.h>
int main(void) {
char ch;
ch = 'a','b','c';
printf("%c", ch);
return 0;
}出力結果
この場合は a が出力されます。ここでのカンマは演算子として機能しますが、その優先順位は代入演算子(=)よりも低いため、まず「ch = 'a'」の代入が実行され、その後 'b'、'c' が評価されて捨てられるからです。
a
例3:括弧で囲んでカンマ演算子を使った場合
#include <stdio.h>
int f1() {
return 43;
}
int f2() {
return 123;
}
int main(void) {
int a;
a = (f1() , f2());
printf("%d", a);
return 0;
}出力結果
この場合は 123 が出力されます。括弧で囲まれた部分ではカンマが演算子として機能し、まず f1() が評価された後にその値が破棄され、最終的に2番目の式 f2() の戻り値である123が変数aに代入されます。
123
まとめ
カンマが「セパレータ」として働くか「演算子」として働くかは、置かれた文脈によって決まります。特に代入と組み合わせる場合、優先順位の関係から直感に反する結果になることがあります。カンマ演算子を意図的に使いたい場合は、括弧で明示的に囲むことで可読性と安全性を高めることができます。
-
C/C++三項演算子(?:)に関する興味深い所見と注意点
三項演算子とはC/C++における三項演算子は、if...else文の代わりに使用できる条件演算子で、「?:」という記号で表されます。「?」がif部分に相当し、「:」がelse部分に相当します。この記事では、実際のコード例を通して、三項演算子の型変換に関する興味深い挙動を3つのケースに分けて解説します。例1:正常にコンパイルできるケース以下のプログラムはエラーなくコンパイルできます。これは、三項式の戻り値の型がfloat型(第2オペランド exp2 の型)とみなされ、第3オペランド exp3(int型のリテラル0)がfloat型へ暗黙的に変換可能だからです。#include <iostre
-
C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説
AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ