C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 行末のセミコロンの省略


(過去ログ 53 を表示中)

[トピック内 37 記事 (1 - 20 表示)]  << 0 | 1 >>

■29161 / inTopicNo.1)  行末のセミコロンの省略
  
□投稿者/ やじゅ (832回)-(2008/12/04(Thu) 21:58:05)
やじゅ さんの Web サイト

分類:[C#] 

VBerの私ですが最近C#をいじり始めました。
さて、C系の言語といえば、行末のセミコロンは必須だったりするわけですが
RubyやJavaScriptなどのLL言語でも行末はセミコロンではありますが、省略
可能になっております。

将来的に、C系言語でも行末のセミコロンの省略の動きは出てくるのでしょうか?

まー端的にいえば、邪魔(^^;

引用返信 編集キー/
■29163 / inTopicNo.2)  Re[1]: 行末のセミコロンの省略
□投稿者/ 出水 (98回)-(2008/12/04(Thu) 22:09:16)
そんな変更があったら下位互換性が取れないから、どう考えてもないです
引用返信 編集キー/
■29169 / inTopicNo.3)  Re[2]: 行末のセミコロンの省略
□投稿者/ まさる (38回)-(2008/12/05(Fri) 00:16:34)
まさる さんの Web サイト
No29163 (出水 さん) に返信
> そんな変更があったら下位互換性が取れないから、どう考えてもないです

むしろVBにセミコロンを採用してくれないかな・・・と思う程度のC系言語脳。
引用返信 編集キー/
■29170 / inTopicNo.4)  Re[3]: 行末のセミコロンの省略
□投稿者/ ちゃっぴ (162回)-(2008/12/05(Fri) 00:29:05)
ちゃっぴ さんの Web サイト
> むしろVBにセミコロンを採用してくれないかな・・・と思う程度のC系言語脳。

結構改行よく使うので、";" 打つ方がいいと思っている今日この頃。
見た目でも結構わかりやすいと思いますよ。

言語は全く違うけど、SQL Server を command line で扱うとき、"GO" 叫ぶの忘れるんだよな。
引用返信 編集キー/
■29173 / inTopicNo.5)  Re[1]: 行末のセミコロンの省略
□投稿者/ アキラ (128回)-(2008/12/05(Fri) 02:27:28)
アキラ さんの Web サイト
2008/12/05(Fri) 02:28:25 編集(投稿者)

No29161 (やじゅ さん) に返信
C系と言っていいのかわかりませんが、Scalaはセミコロン省略できます。
(メンバにアクセスするための . や、関数呼び出しのカッコも省略できます)

Scalaを学べば、C++やC#のような言語でも下位互換性を保ったまま
セミコロンを省略可能にするのは不可能ではないと思えます。
引用返信 編集キー/
■29174 / inTopicNo.6)  Re[1]: 行末のセミコロンの省略
□投稿者/ アキラ (129回)-(2008/12/05(Fri) 02:28:29)
アキラ さんの Web サイト
2008/12/05(Fri) 02:29:10 編集(投稿者)

二重投稿のため削除
引用返信 編集キー/
■29175 / inTopicNo.7)  Re[1]: 行末のセミコロンの省略
□投稿者/ NyaRuRu (74回)-(2008/12/05(Fri) 04:35:46)
2008/12/05(Fri) 05:36:49 編集(投稿者)
2008/12/05(Fri) 05:31:36 編集(投稿者)
2008/12/05(Fri) 04:43:54 編集(投稿者)
2008/12/05(Fri) 04:38:56 編集(投稿者)

No29161 (やじゅ さん) に返信
> RubyやJavaScriptなどのLL言語でも行末はセミコロンではありますが、省略
> 可能になっております。

JavaScript に関してですが,

return 1

return
1

の意味が違うみたいですね.

http://shinh.skr.jp/m/?date=20071124#p05
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/7_Lexical_Conventions.html#section-7.9

また,JavaScript では
a = b + c
(d + e).print()
は,
a = b + c(d + e).print()
の意味になるとか.

この辺を参考にしてみると,C# で (ECMAScript 方式の) 行末のセミコロンの省略を導入したときに何が起きるか何となく見えてくる気がします.
まず return 1 に関しては C# では曖昧性は表れなさそうですが,throw は引っかかりそうです.
C# では,既に以下のようなコードが書かれている可能性があるので
throw
new Exception();
このコードの意味が変わらないような省略ルールでなければなりません.

また,丸括弧が関数 (デリゲート) 呼出しに使われている点にも注意が必要そうです.つまり,
Func<string,string> f;
string s;
とあったときに,
var a = f
(s+"!").ToString();
のようなコードが既に書かれていてもおかしくないわけですが,このコードの意味を変えないようなルールにしなければなりません.
つまり,次のトークンが括弧で始まる場所では,セミコロンを省略した形で var a = f と書けないことが起こりえます.

# 個人的には,次期 VisualBasic で検討中といわれている行継続の省略に関しても,似たような病的なケースが無いか多少気がかりだったりします.
引用返信 編集キー/
■29179 / inTopicNo.8)  Re[2]: 行末のセミコロンの省略
□投稿者/ あんどちん (28回)-(2008/12/05(Fri) 09:15:20)
セミコロンはそもそも1センテンスの終わりであって行末の終わりじゃないです。

int a = 0; float b = 1.0;

コンパイラで通りますよね?


引用返信 編集キー/
■29181 / inTopicNo.9)  Re[3]: 行末のセミコロンの省略
□投稿者/ たくボン (92回)-(2008/12/05(Fri) 09:50:01)
No29169 (まさる さん) に返信
> ■No29163 (出水 さん) に返信
> むしろVBにセミコロンを採用してくれないかな・・・と思う程度のC系言語脳。

セミコロンはありませんが、コロンならBASICの時代からありますよ:-)
ただ、全ての行にコロン書いたらものすごく可読性悪くなりますが。。。

> # 個人的には,次期 VisualBasic で検討中といわれている行継続の省略に関しても,似たような病的なケースが無いか多少気がかりだったりします.

おそらくプリコンパイラ時にラムダとかで解決するんだと思うけど、頭良くないからいまいち信用できない。しばらくは色々と問題出るかもしれませんね。

# っていうか、こんな機能でコンパイルの時間を取るくらいなら.NET全体のパフォーマンスを上げて欲しい今日この頃・・・orz

引用返信 編集キー/
■29182 / inTopicNo.10)  Re[2]: 行末のセミコロンの省略
□投稿者/ よねKEN (217回)-(2008/12/05(Fri) 09:56:22)
2008/12/05(Fri) 10:05:35 編集(投稿者)

VBもC#も使う人ですが、それぞれの言語を行き来するときに;のあり/なしの
罠に少し嵌ってから慣れるという過程を毎回踏んでいます。
行末セミコロンの有無はすぐ慣れるのでどっちでもいいんですが、
面白そうなのでコメントします。

その前に下位互換って言葉が個人的にわかりにくいので確認しておくと
「過去のコンパイラでコンパイル可能な過去のコード、
 新しいコンパイラでコンパイル可能な新しいコード
 のどちらも新しいコンパイラでコンパイルできること」
でいいですかね?

あんどちんさんの例
> int a = 0; float b = 1.0;

この場合は最後の「;」は省略可能として、
int a = 0; float b = 1.0
というように省略できればOKですね。

NyaRuRuさんのJavaScriptでの話の例
> また,JavaScript では
> a = b + c
> (d + e).print()
> は,
> a = b + c(d + e).print()
> の意味になるとか.

こういうようなパターンの場合があると、2通りの解釈ができるので「;」を省略可能とするには、
どちらかの解釈に寄せなければならず、Warningで対処などになり、互換性はどこかで犠牲になりますね。

> # 個人的には,次期 VisualBasic で検討中といわれている行継続の省略に関しても,似たような病的なケースが無いか多少気がかりだったりします.

VS2010CTPで現時点の実装の確認はできますね。
私もどはまりするパターンがありそうで怖いなと思っています。
(自分が普通に書くコードでは問題が起きるとは思わないけど)

--脱線ここから--
Dim s =
"あ"

こういうコードが書けます。"あ"の代わりに関数が来たら?
Dim s =
f("あ")

確か実験した範囲ではDim s = f("あ")の意味で解釈されました。
では、以下のようだったら?
Dim s = f
("あ")

VBの場合、変数は定義しなくても使えます。fは変数か?変数だとして、
fの中身がデリゲートだったら?ローカル変数fと関数fが定義されていたら?
文脈の解釈で怪しい結果になるパターンがあるなら、その仕様の導入は避けた方が無難かなと思います。
--脱線おわり--

ところで、今のC#は下位互換性は1.0から完全に保たれているのでしょうか?

うろ覚えですが、(削除)
<修正>
↑うろ覚えで書いた内容の根拠が見つけられないので、限りなく誤情報書いたっぽいので削除します。
<修正>

引用返信 編集キー/
■29183 / inTopicNo.11)  Re[3]: 行末のセミコロンの省略
□投稿者/ .SHO (295回)-(2008/12/05(Fri) 10:02:19)
if や for while などの実行文が1行の場合でも
必ず {} で囲まなければいけない仕様に変更しなければ無理です。
引用返信 編集キー/
■29185 / inTopicNo.12)  Re[3]: 行末のセミコロンの省略
□投稿者/ みきぬ (277回)-(2008/12/05(Fri) 10:08:33)
No29182 (よねKEN さん) に返信
> ところで、今のC#は下位互換性は1.0から完全に保たれているのでしょうか?
>
> うろ覚えですが、(削除)
> <修正>
> ↑うろ覚えで書いた内容の根拠が見つけられないので、限りなく誤情報書いたっぽいので削除します。
> <修正>
>
私もうろ覚えだけど、C# 3.0 になったときに何かなかったっけ? ラムダ式とかそのへんで。
# と思って根拠探しているけど見つからない罠
引用返信 編集キー/
■29187 / inTopicNo.13)  Re[4]: 行末のセミコロンの省略
□投稿者/ 渋木宏明(ひどり) (977回)-(2008/12/05(Fri) 10:31:57)
渋木宏明(ひどり) さんの Web サイト
> 私もうろ覚えだけど、C# 3.0 になったときに何かなかったっけ? ラムダ式とかそのへんで。
> # と思って根拠探しているけど見つからない罠

C# 3.0 だけでなく、毎回ちょびっとずつは互換性を損なう変更が行われているはず。

C# "braking change"
http://search.live.com/results.aspx?q=C%23+%22braking+change%22&go=&form=QBRE
引用返信 編集キー/
■29189 / inTopicNo.14)  Re[3]: 行末のセミコロンの省略
□投稿者/ Chuki (4回)-(2008/12/05(Fri) 11:20:28)
行継続は、宣言とか呼び出し内のカンマで区切られるトークン部分だけにして欲しいと願う今日この頃。
#宣言時にだらだら横に長く書いちゃうのもキモイ、 , _ キモイ。
No29182 (よねKEN さん) に返信
> 2008/12/05(Fri) 10:05:35 編集(投稿者)
>>># 個人的には,次期 VisualBasic で検討中といわれている行継続の省略に関しても,似たような病的なケースが無いか多少気がかりだったりします.
>
> VS2010CTPで現時点の実装の確認はできますね。
> 私もどはまりするパターンがありそうで怖いなと思っています。

引用返信 編集キー/
■29197 / inTopicNo.15)  Re[3]: 行末のセミコロンの省略
□投稿者/ やじゅ (833回)-(2008/12/05(Fri) 13:25:34)
やじゅ さんの Web サイト
みなさん、コメントありがとうございます。
なんか、よねKENさんの回答がよさげで、私が特に書くことなくなってしまったかな。

なにげに、奥が深いですね。

VBerの私は、セミコロンは「顔文字(^^;」の時に使うくらいです。
最近はJavaScriptとかRubyも少ししかさわってないので。
キーボードのセミコロンは汚れてないや
引用返信 編集キー/
■29206 / inTopicNo.16)  Re[2]: 行末のセミコロンの省略
□投稿者/ NyaRuRu (75回)-(2008/12/05(Fri) 14:06:35)
2008/12/05(Fri) 14:24:59 編集(投稿者)

Rubyだとこういうケースもあるみたいですね.

y = 10 *
(1 +
2 +
4)

この y の値は 70 でまあそうかなという感じですが,少し変えると

x = 10 *
(1
+ 2
+ 4)

x の値は 40 になるそうで.

http://d.hatena.ne.jp/kwatch/20081204/1228404215
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/45669
引用返信 編集キー/
■29207 / inTopicNo.17)  Re[3]: 行末のセミコロンの省略
□投稿者/ .SHO (299回)-(2008/12/05(Fri) 14:11:50)
No29206 (NyaRuRu さん) に返信

> x = 10 *
> (1
> + 2
> + 4)
>
> x の値は 40 になるそうで.

めんどくさっ^^;
; 使う仕様の方がわかりやすいですね。
慣れかな?

引用返信 編集キー/
■29208 / inTopicNo.18)  Re[4]: 行末のセミコロンの省略
□投稿者/ あんどちん (29回)-(2008/12/05(Fri) 14:26:59)
a = 長い名前の関数()
+ 別の長い名前の関数();
って書いたほうが見やすい場合もありますよね。

C/C++の場合プリプロセッサが展開したマクロが必ず改行どおりにならない場合もあります。
#define hoge(a,b) \
長い関数名a(a) + \
長い関数名b(b) \

c = hoge(1,2);
としたときに
c = 長い関数名a(a) + 長い関数名b(b);
と展開される場合もあります。

その辺を考えるとセミコロンあったほうがコンパイラの実装楽なんじゃないでしょうか?



引用返信 編集キー/
■29210 / inTopicNo.19)  Re[5]: 行末のセミコロンの省略
□投稿者/ .SHO (300回)-(2008/12/05(Fri) 14:37:55)
No29208 (あんどちん さん) に返信

> その辺を考えるとセミコロンあったほうがコンパイラの実装楽なんじゃないでしょうか?

「error CS1002: ; が必要です。」というコンパイルエラーがよろしくないですね。

そんなこと言うなら勝手に付けてくれよ!
つか、そんなことわかるならセミコロンいらない仕様にしてくれ!
と言いたくなるのも、わからなくもないです^^;
引用返信 編集キー/
■29211 / inTopicNo.20)  Re[5]: 行末のセミコロンの省略
 
□投稿者/ あんどちん (30回)-(2008/12/05(Fri) 14:38:09)
No29208 (あんどちん さん) に返信
> C/C++の場合プリプロセッサが展開したマクロが必ず改行どおりにならない場合もあります。
> #define hoge(a,b) \
> 長い関数名a(a) + \
> 長い関数名b(b) \
>
> c = hoge(1,2);
> としたときに
> c = 長い関数名a(a) + 長い関数名b(b);
> と展開される場合もあります。
>

この辺はおかしなこと書いちゃったから無しで^^;

かわりに別の意見を
C/C++の場合こう書くと文字列が連結されます
char* p = "hogehoge"
"hogehoge";

char* p = "hogehogehogehoge"
と同じです。




引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -