文字列の連結をするには (strcat / + / .)

+ または . という演算子でできる言語が多い。

Go言語 Java Scala PHP Python Ruby Perl JavaScript Haskell
+ + + . + + . + ++

+ に数値を与えればほとんどの言語で加算演算子になる。

関連

C言語

strcpystrcat 関数などを使う。

文字列リテラルを並べて書くと、プリプロセッサによって連結される。

"abc" "def"

Go言語 (golang)

+ 演算子で連結できる。

"abc" + "def"

文字列リテラルを演算子を挟まずに並べると、C言語のように連結されることはなく、コンパイルエラーになる。

Java

+ 演算子で連結できる。

"abc" + "def"

静的な文字列同士の連結はコンパイル時に連結される。

文字列リテラルを演算子を挟まずに並べると、C言語のように連結されることはなく、コンパイルエラーになる。

Scala

Javaと同様に + 演算子で連結できる。

"abc" + "def"

静的な文字列同士の連結はコンパイル時に連結される。

文字列リテラルを演算子を挟まずに並べると、C言語のように連結されることはなく、コンパイルエラーになる。

+ の前に改行を入れてしまうと、セミコロンが省略されたものとみなされて、コンパイルエラーになるかもしれない。コンパイルエラーにはならずに、でも意図した動作にはならない場合もある。

# 以下はコンパイルエラーになる
val str = "abc"
  + "def";

# 以下はコンパイルエラーにならないが意図とは違うかもしれない
def f(): Int = 10;
val str = "abc"
  + f();
println(str);
# ここでは abc と表示され、abc10 にはならずにf()の返り値は無視される

Groovy

JavaやScalaと同様に + 演算子で連結できる。

"abc" + "def"

文字列リテラルを演算子を挟まずに並べると、C言語のように連結されることはなく、コンパイルエラーになる。

Scalaと同様に + の前に改行を入れてしまうと、セミコロンが省略されたものとみなされて、コンパイルエラーになるかもしれない。コンパイルエラーにはならずに、でも意図した動作にはならない場合もある。行末に \ を置くと、セミコロンの補完が抑制されて、コンパイルエラーにはならない。

# 以下はコンパイルエラーになる
str = "abc"
  + "def"

# 以下は問題なく "abcdef" になる。
str = "abc" \
  + "def"

# 以下はコンパイルエラーにならないが意図とは違うかもしれない
def f() { 10 }
str = "abc"
  + f()
println str
# ここでは abc と表示され、abc10 にはならずにf()の返り値は無視される

PHP

. 演算子で連結できる。

'abc' . 'def'

文字列演算子 | PHP Manual
http://php.net/manual/ja/language.operators.string.php

Smarty

cat修飾子でできる。

{$foo|cat:$bar}

片方が変数でなくてリテラルの場合

{$foo|cat:'bar'}

Python

+ 演算子で連結できる。

'abc' + 'def'

文字列と数字の間で暗黙の型変換をすることはなく、そのまま連結することはできないので、 str関数などを使う。

print(12 + "42")
# => エラー

print(str(12) + "42")
# => 1242

print(12 + int("42"))
# => 54

文字列リテラルを並べて書くと演算子を書かなくても連結される。改行を挟んでもよい。

"abc"
"def"

この2行の文字列は下の3つすべてと同じである。

"abcdef"
"abc" "def"
"abc" 'def'

以下のコードはぱっと見に反して2箇所が連結されて4つの要素のリストになる。この類はわかりづらいバグの元になるので要注意。

["1", "22", "333"
 "4444," "55555", "666666"]

この種の連結は文字列リテラルの書き方('...', "...", """...""" など)が混在していてもいいので、以下のように三重引用符(""")で文字列を書きつつ、中に三重引用符自体を含めたいときは、そこだけ別の文字列リテラルで書く、ということもできる。

print("""/"/""/""" '"""' """/""")
# => /"/""/"""/

文字列リテラル同士の連結は + 演算子を使っても使わなくても実行時ではなくコンパイル時に連結されるらしい。

二項算術演算 | Python 2.7 documentation
http://docs.python.jp/2/reference/expressions.html#binary-arithmetic-operation

二項算術演算 | Python 3 documentation
http://docs.python.jp/2/reference/expressions.html#binary-arithmetic-operations

Ruby / JRuby

+ 演算子で連結できる。

'abc' + 'def'

+ 演算子は非破壊的だが、concatメソッドは破壊的に文字列を連結する。

str = 'abc'
str.concat('def')
puts str
# => abcdef

concat の代わりに << でも同じで破壊的に文字列を連結する。

str = 'abc'
str << 'def'
puts str
# => abcdef

String#+ メソッド | Ruby 2.2 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.2.0/method/String/i/=2b.html

String#<< メソッド, String#concat メソッド | Ruby 2.2 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.2.0/method/String/i/=3c=3c.html

Perl

'abc' . 'def'

複合代入演算子もある。

$str .= 'def';

Haskell

文字列は文字のリストなので、リストの連結の演算子を使う。

> "abc" ++ "def"
"abcdef"

JavaScript

"abc" + "def"
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。