• ベストアンサー

この記述の意味を教えてください

jsumとsumが整数、bjがフロートとして、 if (jsum) sum += bj; Accumulate the sum. jsum=!jsum; Change 0 to 1 or vice versa. という計算があるのですが、どういう意味でしょうか? jsumは演算子ではなく、数値なのに括弧で区切ってsumの前にもってくるのは どういう意味があるのでしょうか? != はnot equalという意味ですが、=! はどういう意味なのでしょうか?

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

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

丁寧に書くと if (jsum != 0) { sum += bj; } /* Accumulate the sum. */ if( jsum != 0 ) { jsum= 0 ; } else { jsum = 1 ; } /* Change 0 to 1 or vice versa. */ ○ if 文は if ( 式 ) 式文 else 式文 というのが正式な文法です。(else以降は省略可能) この式文というのは 式 ; という式と; をセットにした単文と {式文...} と{}で0個以上の単文を括った複文(ブロック)があります。 if(){}else{} が正しい形みたいに参考書には載っていますが、式文が一つだけなら、{}は不要なのです。 ただ、間違えないように 必ず{}でくくる、という自主ルールを適用することが多いです。 なお、for、while等の他の「{}が必要」と思われている文も同様です。 for(i=0;i<10;i++);{printf("hello");} と書いてしまって、1回しか表示されない、等という間違いを犯すことがあります。 ※ 式には「何もない」という「式」も含まれます。よって ; だけ、という式文も「正しい式文」です。 ※ また、{}はforやif等が無くても、単独で使うことができます。 また、 for(i=0;i<10;i++)   printf("hello");   printf("world"); 等と書かれていても、字下げに惑わされてはいけません。これは for(i=0;i<10;i++) {   printf("hello"); } printf("world"); と同じです。 ○ ! 演算子 論理を反転します。 VBで言うなら、 Boolean値に対してのNotにあたります。 Cでは 0 : Boolean のFalse に相当 0以外 : Boolean のTrue に相当 となっています。 また、 !演算子は !a aが真 :0 aが偽 :1 となる演算子です。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

> VB形式で... 1であれば0に、0であれば1にするということで if jsum <> 0 then sum =sum +bj jsum = 1-jsum あるいは、 Dim jsum As Booleanとしておいて 論理値を反転させる if jsum then sum =sum +bj jsum = Not jsum

全文を見る
すると、全ての回答が全文表示されます。
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.3

if (jsum) sum += bj; Accumulate the sum. jsum=!jsum; Change 0 to 1 or vice versa. sum=sum+bj をjsumの型に入れる。 で、否定ですから、 加算した結果が0なら1、1なら0となります。

KUZUY
質問者

お礼

やはりよく分かりませんので VB形式で書いていただけないでしょうか? よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
noname#190876
noname#190876
回答No.2

もっと、四角四面な書き方なら if (jsum != 0) sum +=bj; jsum = ! jsum; ということで、1つめは、キャストではなく、ゼロでなかったら、の意味でつかわれてます。  2つめの方は、! は、論理否定の意味です。  Cでは、真は、ゼロでない。偽は、ゼロの意味を、論理値では、とります。

KUZUY
質問者

お礼

VBと同じ書き方にすると、 if jsum <> 0 then sum =sum +bj jsum = 0 という意味でしょうか? 一応、これでも試してみましたが、思った通りの結果が得られないのですが。

全文を見る
すると、全ての回答が全文表示されます。
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

(jsum) sum について キャストと言って、普通は(int)i のようにその型に入れたように型変換します。 jsumと同じ型にしたいのですね。 jsum=!jsum; について =!ではなく、 !jsum を代入しています。!jsum はビット演算子not(=否定)です。

KUZUY
質問者

お礼

ありがとうございます。 ただ、やはり分からないのですが、 一つ目の方はif文になっていますが、 sumをjsumと同じ型に変換した後に、 sum = sum +bj が正しいかを判定するという意味なのですか? bjがゼロでない限り、この関係が成り立つわけはないと思うのですが。 二つ目の方で http://masudahp.web.fc2.com/cl/kiso/ck0204.html に!の使い方が書かれていますが、 !jsumでゼロという意味なのですよね? となると jsum=0; と何が違うのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SUMIF関数

    今Excelのあるセルに{=SUM(IF(BJ1:BJ10059="合計",BK1:BK10059,0))+SUM(IF(BJ1:BJ10059="合計",BL1:BL10059,0))}という関数が入力されています。 そこに数値が表示されています。 しかし、この中のセルの数値を変更すると0と表示されてしまいます。(同じ数字に戻しても同じです。)なぜ0が表示されるのか分かりません。 どうしたら正しい数値が表示されるのか教えてください。

  • DOM と if 構文

    下記のif構文の意味が分かりません。もやもやしている感じです。 イコールやノットといった演算子が使われていないので、条件のように感じられないのですが。 if(document.getElementById) if(document.all)

  • 同じ意味になるように穴埋めする問題

    同じ意味になるように穴埋めする問題 について答えあわせをお願いします 1、 IT IS CERTAIN THAT SHE HAS REMARKABLE ABILITY SHE IS CERTAIN 括弧1括弧2 REMARKABLE ABILITY 括弧1→GOING括弧2→TO でしょうか? 2、 THE GIRL IS SITTING OVER THERE. I LIKE HER. THE GIRL 括弧3括弧4括弧5 IS SITTING OVER THERE. 括弧3→ WHO 括弧4→ I 括弧5→ LIKE 3、 IT IS RAINY, SO I CAN NOT GO OUT NOW. IF IT 括弧6,I 括弧7 GO OUT NOW. 括弧6→ウェザー 括弧7→COULD 括弧に入る単語は正しいでしょうか? 頭の悪さに悲しくなりますが、これから勉強頑張りたいので教えて下さい

  • scanfの入力をgets関数で読み捨てることについて

    -------------------------------------- #include<stdio.h> int main(void) { double dt=0.0,sum=0.0; char ss[80]; int ret; ret=scanf("%lf",&dt); puts(""); if(ret!=1){ gets(ss); printf("数値を入力してください\n"); puts(""); } while(dt!=999){ sum=sum+dt; ret=scanf("%lf",&dt); puts(""); if(ret!=1){ gets(ss); printf("数値を入力してください\n"); puts(""); } } printf("合計=%f\n",sum); return 0; } -------------------------------------- 以上のプログラムで、入力した数値の合計を出し「999」が入力されたら終了させ、数値以外が入力されたら、gets関数で読み捨て入力を続けていくということをしたいのですが、例えば、 ◎1----------- 2 3 4 999 合計=9.000000 --------------- ◎1のように数値のみだと正しく表示されます。 次に、 ◎2-------------------- a 整数を入力してください b 整数を入力してください 2 3 999 合計=5.000000 ------------------------ ◎2のように数値以外を先に入力し、その後に数値を入力しても正しく表示されます。 次に、 ◎3------------------- 2 3 a 数値を入力してください b 数値を入力してください 999 合計=11.000000 ----------------------- ◎3のように数値を入力した後に、数値以外を入力したら正しく表示されません。 次に、 ◎4-------------------- 2 a 整数を入力してください b 整数を入力してください 3 999 合計=9.000000 ------------------------ ◎4のように数値をまず入力しその後、数値以外を入力する。その後、数値を入力して終了させても、合計値が正しく表示されません。 まだ、バッファについて完全に理解していないということもあり、何故こうなってしまうのか分かりません。 教えていただけると嬉しいです。

  • javaのswingについて質問です。

    1桁の演算をする簡単な電卓を書いてみたのですが。。。分からない所だけ少し抜粋しました。見て下さい。 class SampleKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { if(flag==false){    //ここで演算子の処理を.....1 char key=e.getKeyChar(); switch(key){ case '-': lb1.setText("引き算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("-"); now="minus";break; case '+': lb1.setText("足し算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("+"); now="plus";break; case '*': lb1.setText("かけ算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("*"); now="kakeru";break; case '%': lb1.setText("割り算をします。数字を入力して下さい。");lb2.setText(str);lb3.setText("%"); now="waru";break; } } if(flag==true){   //ここから数字の処理を(1桁のみ)....2 int k=e.getKeyCode(); switch(k){ case KeyEvent.VK_0: str="0";if(now=="plus"){ sum=sum+0; } else if(now=="minus"){ sum=sum-0; } else if(now=="kakeru"){ sum=sum*0; } else if(now=="waru"){ sum=sum/0; } else{ sum=0; } flag=false;break; //以下9まで同じ処理をします。(数値だけ変更しますが) } b2.setText(str); lb3.setText(Integer.toString(sum)); } .... ここで数値と演算しを交互に入力させて、どちらかを続けて入力するとエラーをはくしくみにしたいのですが、最初の考えはint count=0;などをつくりメソッドが呼び出された回数を数え上のメモの1、2、を切り替えてswitch文の条件にないものを入力したときはエラーをという考えでした。しかしそうしてしまうと演算子のほうで乗算記号と8が自分のPCでは同じキー(乗算の演算子のときはshiftキーを押します)なのですが、乗算のときに乗算とともに8も反応してしまい結果がおかしくなるのと演算子と数字を交互に入力させる制限もうまくいきませんでした。そこで上の様にbooleanでフラグを作true,falseで分岐させると乗算演算子のときに8は反応しなくなったのですが(入力の制限もできています)みてお分かりになるように、数字の入力→演算子の入力でとまってしまいます。flagをfalseからtrueに変えるのをそれぞれの演算子の方のswitch文にいれるとこんどはまた8が反応してしまうのと入力制限ができないです。どこにflagの切り替えをまたはどのようにしたらうまくできるでしょうか

  • c言語の勉強をしているのですが、詰まってしまっています。

    複数回整数を入力し、-1以下もしくは101以上の入力で整数の入力を終了、 最後の-1以下もしくは101以上の数値を省いた 合計と平均の算出をしたいのです。 が、現状。 { int sum=0,p=0,n=0; while(0<=p){ printf("点数:"); scanf("%d",&p); if(0<=p){ sum=sum+p; n++; } } printf("%d",sum); printf("%6.2f",(double)sum/n); return 0; } で、101以上の際の処理ができません。 お教えいただける方、よろしければお願いいたします。

  • Verilogでメモリのmoduleと演算のmoduleを組み合わせたい

    module spram_sr(clk, we, address, data_i, data_o); input clk; input we; input [7:0] address; input [2:0] data_i; output [2:0] data_o; reg [6:0] ram [15:0]; reg [6:0] read_a; always @(posedge clk) begin if (we) begin ram[address] <= data_i; end read_a <= address; end assign data_o = ram[read_a]; endmodule を使って、メモリから8bitの整数を取り出して、0~15個の数値をたすような計算をさせたいと思って別に計算させるmoduleを作りました。これに計算をさせるスタート信号と計算終了を知らせるフィニッシュ信号を加えています。 module sigma(clk,x,sum,start,finish); input clk; input[7:0] x, start; output[7:0] sum; output finish; reg[7:0] sum,start,write_add; reg finish; integer i; always@(posedge clk) begin if(start) for(i=0;i<=15;i=i+1) sum<=sum+x[i]; write_add<=sum; finish<=1'b1; end endmodule この二つを使いたいのですが、メモリから演算のモジュールに整数を渡すやりかたがわかりません。もう一つmoduleを使って制御する必要があるのでしょうか?すいませんが、どなたか教えていただけないでしょうか?

  • プログラミングで質問があります。

    プログラミングで質問があります。 実数値を入力して、その平均を出すプログラミングを作ったのですが、うまく行きません。 どこが間違っているのか教えてほしいです #include <stdio.h> int main (void) { float a=1,sum=0; int b=0,i; while(a!=0) { printf("整数値を一つ入力してください。"); scanf("%f",&a); if(a!=0) { b=b+1; } for(i=0;i<=b;i=i++) { sum=sum+a; } } printf("平均値は%fです\n",sum/b); } 実行して、10、10、10と入力すると、90になってしまいます(..;)

  • 「404判定のstrpos」の演算子が分からないの

    「404判定のstrpos」の演算子の意味が分からないので、教えてください。 ▽404 Not Found時の対処 | PHPのQ&amp;A【OKWave】   http://okwave.jp/qa/q4783971.html に掲載されていた下記を試したら、期待した動作になったのですが、 if (strpos($hdr[0],'404')!==false){  echo 'Not Found'; } else { しかし、 ▽PHP: strpos - Manual   http://php.net/manual/ja/function.strpos.php を参考に、「===演算子」へ変更したら、 if (strpos($hdr[0],'404')===false){  echo 'Not Found'; } else { 正常なURL(200)も、全てNot Foundになってしまいます。 ちなみに、 if (strpos($hdr[0],'404')==true){ だったら、期待通りの動作になりますが、 if (strpos($hdr[0],'404')===true){ だと、何が来ても同じ結果になります。 なんででしょうか? strpos関数の返り値を調べる際 ===演算子 を 利用しなくても良いのでしょうか?

    • ベストアンサー
    • PHP
  • VBA 加算演算時のトラブル

    事務処理用に準備したVBA処理の数値合計チェックにて本来イコールとなるべきところ、ノットイコールと判定されてしまいます。当該部分を抜き出し、わかりやすくしたものが下記のロジックですが、ここで、test2,test4は結果がイコールとなるものの、test3の場合、ノットイコールとなってしまいます。どなたか、原因につき教えていただけませんか? Dim aaa As Double Dim bbb As Double sub test2() bbb = 16.67 + 16.67 aaa = 33.34 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test3() bbb = 16.67 + 16.67 + 16.67 aaa = 50.01 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test4() bbb = 16.67 + 16.67 + 16.67 + 16.67 aaa = 66.68 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End sub