• ベストアンサー

C言語で表現できますか!?

 素人なので、変な質問しているのか、自分でも判断できません!? PHPの整数型へのキャストプログラム~  <?php $int1 = intval("1"); $int2 = (int)"1";    以上ですが、同じようなプログラムをC言語でもできますか!  もしできれば、  どんなプログラムになるのでしょうか!?  宜しくお願いします。  

  • PHP
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

Cでの扱いは他の回答者さんが述べられている通り なので、ここでは違いを述べます。 先ず、PHPではデータ型はありません。内部的には 文字型、整数型、実数型、オブジェクト型、資源型 配列型の区別がありますが、プログラムとしては 考えなくていいようになっています。 $a = "1"; $b = 3 + $a; 型のウルサイ言語ですと、エラーになるところですが、 ちゃんと$b=4になります。 勿論、計算に使う時は型変換が行われるので、その 分だけオーバーヘッドがあります。だから、計算に使う と分かっていれば最初から整数型にして、このロスを 防ぎたいと思いますよね。そういう人向けにintvalとか キャストにより、明示的に整数化する手段が用意されて いる訳です。 C言語では文字の"1"と数値の1は全く別のものなので、 自力で型変換処理をしなければなりません。また、 関数などでは引数や戻り値の型指定がウルサイため、 キャストしないとコンパイルエラーになったりします。 >C言語でもできますか いえ、C言語ではやらなければいけないのです。 因みにPHPでは「やってもいいし、やらなくてもよい」です。

Campus2
質問者

補足

ご回答ありがとうございました。  以下ご紹介していただいた  ご回答の $a = "1"; $b = 3 + $a; ちゃんと$b=4になります。 以上のご回答が実際に4になるか確かめたいのですが! どんなプログラムを組めば確かめられますか?  PHPバージョンは昨年夏ぐらいに最新版をいれました。 それから更新した記憶はございません。  以上よろしくお願いたします。  

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

Webでやらなくてもイイのでは? <php $a = "1"; $b = 3 + $a; print($b); ?> こういうソースファイル(仮にhoge.php)を作って、 コマンドプロンプトからphp hoge.phpと入力すれば $bの内容が表示されますよ。勿論、phpにパスが 通っていることが前提です。 尚、Webプログラムの方はエラーになった理由と 行番号が表示されるはずなので、それを掲示 してください。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

C言語には「文字列」という型はありません。 特定条件を満す 「文字の配列」を文字列して扱う、という基本ルールがあるだけです。 また、文字、と書きましたが、「文字」という型もありません。 文字に対応した数値を扱える「整数型」があるだけです。 つまり、Cの文字列とは「整数の配列」です。 さらに、C言語の配列とは... ...とPHPとの違いが多過ぎるので、注意しましょう。 「標準的な文字列」を解析して、「数値を文字列にしたもの」を「数値」に変換することはできます。 標準ライブラリには、atoi,strtol等の関数が用意されています、 標準的では無い文字列から変換する場合は、自作する必要があるでしょう。 int2 = (int)"1"; Cでこのようにやると、意味が違ってきます。 文字列を整数にするのではなく、 文字列は配列→配列は先頭要素のアドレス(数値)として表現される→「アドレス」をそのまま数値に変換 となります。 PHP自体は、主にC言語で作られています。 ということは、PHPでできる事は、C言語でもできる、ということです。 「簡単」かどうかはともかく。

Campus2
質問者

お礼

 ご回答誠にありがとうございました。 補足ですが、人、間違いで補足してしまい、お詫びいたします。

Campus2
質問者

補足

ご回答ありがとうございました。  以下ご紹介していただいた  ご回答の $a = "1"; $b = 3 + $a; ちゃんと$b=4になります。 以上のご回答が実際に4になるか確かめたかったので  プログラムの組み方がよくわかりませんでしたが、  プログラムを以下に組みました。しかしエラーがでました。  なぜエラーがでるか教えていただけますか!? <!DOCPYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "html//www.w3.org/TR/xhtml1.DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <?php $a = "1"; $b = 3 + $a; echo $b, PHP_EOL; ?> </body> </html>  以上よろしくお願いたします。

noname#244856
noname#244856
回答No.1

C言語では "1" と '1' の意味は異なります。前者は「char型配列」「char型ポインタ」、後者は「char型の値」となります。まずはこちらをご覧ください。 ASCIIコード表 http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html 整数の「1」と、バイトコード「49」で表される文字の「'1'」は全く異なることに注意してください。 ・int型として扱うとき、バイトコード「1」は整数の「1」を表す。 ・int型として扱うとき、バイトコード「49」は整数の「49」を表す。 ・char型として扱うとき、バイトコード「1」は制御文字「SOH」を表す。 ・char型として扱うとき、バイトコード「49」は文字「'1'」を表す。 厳密に表せば上記のようになっています。これをどうやってキャストするか、 "1" と '1' でそれぞれ見ていきましょう。 【"1"】 C言語にstring型は無く、バイト単位でみて 49 00 という2文字分のchar型配列になります。文字列リテラルとして定義したchar型配列の末尾にはNULL文字が自動的に挿入される決まりになっています。このような配列からint型の値に変換するには、atoi関数を使います。これはstdlib.hで定義されているので、それをincludeする必要があります。 atoi http://hitorilife.com/atoi.php 例: int num = atoi("1"); // 整数の「1」として代入されます 【'1'】 こちらは1バイト 49 で表されるchar型の値ですが、この「'1' (49)」を「1」に直したければ「'0' (48)」を引けば済みますよね。というわけで '1' - '0' とすればint型にキャストしたことになります。PHPの演算規則と全く異なるので注意してください。C言語では文字は単なる「バイト値」に過ぎません。

関連するQ&A

  • まったくわかりません!?

    以下のプログラムですが!?素直に言って、キャストの意味がぜんぜん分かりません!?  インターネットで調べましたが、レベル高すぎて、分かりません!    参考書には、    「整数型へのキャストには、(int)または(integer)またはintval()関数を使います。」  とあります。  以下プログラムの紹介です。 <?php $int1 = intval("1"); $int2 = (int)"1"; 以上ですが!    これて、実行結果が分かれば、何となく理解の突破口が見える気がします。  以上のプログラムをWeb上で実行できますか!?  もし、実行することができれば、どんなプログラムを組めばできますか!?  すみません、頭が悪いので、わかりません_ _!  以上宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • $int5 = PHP_INT_MAX ;

    $int5 = PHP_INT_MAX;     //整数型の最大値  以上、参考書に書いてあるのですが!  素人の私にとりまして、意味がいまいちです!?    PHPの$int5 = PHP_INT_MAX; は、C言語みたいに、何行もプログラムを書かずに  目的の最大値を、取り出せるとの解釈でよろしいのでしょうか!?     以上宜しくお願いいたします。  

    • ベストアンサー
    • PHP
  • C言語の問題で困っています。

    C言語の問題で困っています。 誰か教えてください。 下の問題ですが、intがiだけでプログラムするにはどうしたら良いでしょうか? (a)から(d)に入るプログラムをすいませんが教えてください。 お願いします。 【問題】 1以上10以下の整数を昇順に区切って表示するプログラムです。 実行例 1 2 3 4 5 #include <stdio.h> int main (void) { int i; (A) while ((b)){ (c); (d); } printf("¥n"); return(0); }

  • c言語について

    C言語で、二つの整数値を読み込んで、前者の値が後者の何%であるかを実数で表示するプログラムを作成しようとして以下のコードを書きました。 #include <stdio.h> int main(void) { int n1, n2 ; puts("二つの整数を入力してください。") ; printf("整数A : \n") ; scanf("%d" , &n1) ; printf("整数B : \n") ; scanf("%d" , &n2) ; printf("Aの値はBの%f%%です。\n" , (double)(n1 / n2) * 100) ; return 0 ; } 上記コードを実行すると、0.000000%のような結果になります。 そこで、最後のキャスト演算子を使用した後の式で(n1 / n2) * 100がまずいのかなと考え、n1 / n2 * 100にしたら上手くいきました。 なぜ、上記コードだと上手くいかないんでしょうか?

  • C言語

    C言語のプログラムで『正の整数を読み込み、その整数より小さい3の倍数を全て表示するプログラムを作る』 これをどなたかプログラミングしてください。お願いします。

  • C言語の勉強でわからないところがあります。

    最近C言語の勉強を始めたのですが明解C言語入門編の演習4-3でうまくいかなくて困っています。 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成するものなのですが、うまく起動しません。 まだ勉強を始めたばかりの自分が作ったものなので、つまらないミスや勘違いからでてきたエラーだと思うのですが、見て頂けると嬉しいです。 プログラムは以下の通りです。 #include <stdio.h> int main(void) { int n1,n2; int num=n1; int sub=n2; puts("二つの整数を入力してください"); printf("整数1:"); scanf("%d",&n1); printf("整数2:"); scanf("%d",&n2); printf("%d以上%d以下の全整数の和は", n1>n2 ? n1,n2:n2,n1); do{ if (n1>n2) num=n1+sub; sub=sub+1; printf("%d",num); else sub=n2+num; num=num+1; printf("%d",sub); }while(sub==n1 || num ==n2); return 0; } とすると、「22行目」で記述エラーを発見しました。 「identifier」を付け忘れています。となり、起動されることができません。 elseの文を削除すれば動作するのですが、37,28と入力した場合、1638137と大きすぎる数になってしまいます。 そこで二つ質問があります。 一つ目は、「22行目」で記述エラーを発見しました。 「identifier」を付け忘れています。といったものは、具体的に何処が間違っているのか、です。 二つ目は、何故else文を削除した場合のプログラムで、大きすぎる数になってしまうのかが知りたいのです。 この形に拘らずに組むのもいくつか思い浮かぶのですが、何故この形では動かないのかを知りたいので、間違っているところを指摘して頂けると嬉しいです。 そして、もし可能ならなのですが、正答のようなものは書きこまないで頂けると嬉しいです、間違っている理由だけを指摘して頂いて、なんとか後は自分で考えてみたくて・・・ ワガママな質問ですが、よろしくお願いします。

  • (int)キャストとintvalの違い

    (int)キャストとintvalでは何が違うのでしょうか ・(int)$page; ・intval($page); ▽PHP: intval - Manual   http://jp2.php.net/manual/ja/function.intval.php

    • ベストアンサー
    • PHP
  • C言語の勉強しています。教えてください

    私は現在大学生でC言語が面白そうなので独学しているのですが、分からない点があり、参考書に解答も付属していないのでどなたか教えていただけると非常に助かります。 (参考書名:新版 明解C言語 入門編 著者:柴田望洋) p65の演習4-3 問題:2つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成せよ。 (例)このように表示させたい 2つの整数を入力して下さい。 整数1:37(←例です。ここの数はscanfを利用して手動で打ち込みます) 整数2:28 28以上37以下の全整数の和は325です。 これまでに学習した事を利用して解きたいのでまず、自分でプログラムを書いてみますので訂正していただければ非常に助かります。 どうかお願いします

  • C言語の変数の型がわかりません

    C言語の変数の型がわかりません [int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. [long int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. のようなことが書いてあります. [int]と[long int]の違いは何ですか?

  • c言語のプログラムで

    c言語で 2つの整数を読み込んで小さいほうの数以上で大きいほうの数以下の整数をすべて加えた値を表示するプログラム で最後の表示の仕方がわかりません。 実行結果は 整数1:37 整数2:28 28以上37以下の全整数は325です。と表示されるはずです。 この表示の3行目の28と37の表示がどうやればよいのかわかりません。 #include <stdio.h> int main(void) { int a, b; int sum=0; printf("整数1:"); scanf("%d",&a); printf("整数2:"); scanf("%d",&b); if(a>b) do{ sum=sum+b; b=b+1; }while(b<=a); else do{ sum=sum+a; a=a+1; }while(a<=b); printf("%d以上%d以下の全整数の和は%dです。",a,b,sum); return(0); } 全整数の表示はできます。 do文の中でa=cとかにしてやってみましたが、うまくいきませんでした。 お願いします。

専門家に質問してみよう