DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#でのリテラル定数について

分類:[.NET]

win2000pro,VC#2005Expressです。
C#における定数について質問です。
プログラミングC#第四版の33ページに以下の記述があります。

「定数は3つあります。リテラル、シンボル定数、列挙型の3つです。次の代入において32はリテラル定数です。

x = 32;

32の値は常に32です。32に対して新しい値を代入することはできませんし、どう試みようと、32に99の値を表現させることはできません。」

そして以下のプログラムを書いたのですが、
csc test01.csとしても
「a.cs(7,3): error CS0103: 名前 'x' は現在のコンテキスト内に存在しません。」
となりコンパイルできません。

using System;

class X
{
static void main() {
x = 32;
Console.WriteLine("x");
}
}

リテラル定数とはどのように表現すればよいのでしょうか?
> static void main() {
main ではなく、Main ですよ。

> x = 32;
この場合の x が、何者であるか書かれていないと、エラーになります。
たとえば、
 int x = 32;
 string y = "32";
などと書いてください。
前者は、数値変数 x に「32」というリテラル定数を代入し、
後者は、文字列変数 y に「"32"」というリテラル定数を代入しています。

> Console.WriteLine("x");
この場合、変数 x の中身ではなく、『x という文字』が出力されます。

> リテラル定数とはどのように表現すればよいのでしょうか?
先の『x = 32;』という例で言えば、その中の『32』の部分がリテラル定数です。
> リテラル定数とはどのように表現すればよいのでしょうか?

数字だけから成っていない文字列は、変数扱いになります。xと書けば、xは変数です。ではなく、'x'や、"x"と書けば、それらは変数ではなくリテラル定数になります。

int x = 32;
Console.WriteLine(x);
は、
32と表示されます。

int x = 32;
Console.WriteLine("x");
は、
xと表示されます。

string str = "x";
Console.WriteLine(str);
は、
xと表示されます。
弁士さんありがとうございます。ありがとうございます。
"x"についてはperlと混ざってしまったみたいです。
また、
int x=32;
としてしまったら、「xは定数じゃなくて変数じゃないの?」
と疑問でしたが、32のことをリテラル定数と呼んでいたのですね。
しかし、となると、書籍中の
「32の値は常に32です。32に対して新しい値を代入することはできませんし、どう試みようと、32に99の値を表現させることはできません。」
というのはちょっと紛らわしい書き方のような気もします。
int x = 32;
としてもあとからいくらでも
x = 99;
などとして変更ができるのに。確かに32は99を表現できないですが。

定数というのはてっきりconst int x;などとconst宣言するものだけを定数だと
思っていたのですが、x = yとするときのyもリテラル定数という定数なんですね。
trapemiyaさんありがとうございます。
perlのノリでやってしまいました。
# 解決マークが付いていないうちに、あえてネタとして投稿。

> int x=32;
> としてしまったら、「xは定数じゃなくて変数じゃないの?」
> と疑問でしたが、32のことをリテラル定数と呼んでいたのですね。

一応は、32 の事だけについて書かれているようですけれどね。
元の記述は、誤解を生みやすい表現なのかも。

 元の記述「次の代入において32はリテラル定数です。」
 私の回答「その中の『32』の部分がリテラル定数です。」

# 「代入式の右辺にある 32 という表記はリテラル定数です」などと
# 書いてあれば良かったのかな? (…少し回りくどいかな)


> 「32の値は常に32です。32に対して新しい値を代入することはできませんし、
> どう試みようと、32に99の値を表現させることはできません。」
> というのはちょっと紛らわしい書き方のような気もします。

その場合、どのように記述してあれば良いと思いますか?

(1) リテラルが他の値を表現できないという事について言及すべきではない。
(2) 解説するのは良いが、32 とか 99 といった具体例は示さない方が良い。
(3) 具体例を出しても良いが、○○○のような表現に修正した方が良い。


蛇足ですが、VBScript では、
  Const [32] = 99
のように、数字を定数名として表記できたりします。(要 角括弧)
> 定数というのはてっきりconst int x;などとconst宣言するものだけを定数だと
> 思っていたのですが、x = yとするときのyもリテラル定数という定数なんですね。

定数の中でもconst宣言やenum宣言をしてない値べた書きのものを特に「リテラル」というのでは?

int x,y;
y=32;
x=y;

とかならyは変数であってリテラルどころか定数ですらないと思います。

> とかならyは変数であってリテラルどころか定数ですらないと思います。

すみません。説明不足でした。
x=yのyは任意の値(3とか5とか)という意味で書いたつもりでした。
弁士さん、何度も補足して下さりありがとうございます。

>>「32の値は常に32です。32に対して新しい値を代入することはできませんし、
>> どう試みようと、32に99の値を表現させることはできません。」
>>というのはちょっと紛らわしい書き方のような気もします。
>
> その場合、どのように記述してあれば良いと思いますか?
>
> (1) リテラルが他の値を表現できないという事について言及すべきではない。
> (2) 解説するのは良いが、32 とか 99 といった具体例は示さない方が良い。
> (3) 具体例を出しても良いが、○○○のような表現に修正した方が良い。

うまく説明できないんですが、僕が勘違いしていたのは、x = 32のxが定数だと
思い込んでしまっていたのです。なので32が(僕の中ではx)が99を表現できない
というのはおかしいなと思ってしまったんです。xは変数であり型さえあっていれば
そこには99でも何でも代入できるだろうと。
逆に32が定数だとしたら、32が99になれないのは説明するまでもなく当然のことだ
ろうと思って、どうしてそれが説明されているのか納得できないというか、とにかく
混乱してしまったのでした。
これまで結構入門書を読んできたので、僕にとって変数や定数というのは常に左辺
だったのです。ですから今回の場合もx=32の左辺のxを定数だと勘違いしてしまったのです。
x=32の右辺の32をリテラル定数というということは、新鮮な発見でした。

> 蛇足ですが、VBScript では、
>   Const [32] = 99
> のように、数字を定数名として表記できたりします。(要 角括弧)

トリビアですね。試してみましたがVB6.0ではできませんでした。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板