質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

493閲覧

-4 < 8 の式が変数に置き換わると成立しない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/02/04 01:52

編集2022/02/04 03:17

提示コードの///コメント部内部のコードですが定数のif文が成立すると思いますがそれをそのまま変数に置き換えると成立しませんこれは何が原因なのでしょうか?

確認したこと

演算子の優先順位を確認してカッコをつけました。

Console
y -4 < 8 いいい y: -4 y: -3 y: -2 y: -1 y -4 < 8 いいい y: -4 y: -3 y: -2 y: -1 y -4 < 8 いいい y: -4 y: -3 y: -2 y: -1 y -4 < 8 いいい y: -4 y: -3

cpp

1 2void Stage::Renderer(const glm::mat4 view)const 3{ 4 5 glm::ivec2 cameraPosition = camera->getPosition();//glm::ivec2 int型 6 cameraPosition.x = cameraPosition.x / CELL; 7 cameraPosition.y = cameraPosition.y / CELL; 8 9 10 glm::ivec2 windowSize = FrameWork::GetWindowSize();//glm::ivec2 int型 11 windowSize.x = windowSize.x / CELL; 12 windowSize.y = windowSize.y / CELL; 13 14 15 16 17// printf("%d\n",cameraPosition.y - (windowSize.y / 2) /2); 18 //printf("%d\n\n",stage->at(0).size() - (stage->at(0).size() - windowSize.x) / 2); 19 //printf("%d\n\n",stage->at(0).size() - (stage->at(0).size() - windowSize.x) / 2); 20 printf("y %d\n\n",(cameraPosition.y - (windowSize.y / 2) / 2)); 21 printf(" < %d\n\n",((stage->size() - (stage->size() - windowSize.y)) / 2) ); 22 23///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 24 if(-4 < 8) 25 { 26 printf("いいい\n"); 27 } 28 29 if( (cameraPosition.y - (windowSize.y / 2) / 2) < ((stage->size() - (stage->size() - windowSize.y)) / 2) ) 30 { 31 printf("あああ\n"); 32 } 33///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 34 for(int y = cameraPosition.y - (windowSize.y / 2) / 2; y > ((stage->size() - (stage->size() - windowSize.y)) / 2); y++) 35 { 36 printf("y: %d\n",y); 37 38 if(y >= 0) 39 { 40 for(int x = cameraPosition.x - (windowSize.x / 2) / 2; x < (stage->at(y).size() - (stage->at(y).size() - windowSize.x)) / 2; x++) 41 { 42// printf("x: %d\n",x); 43 44 if( (x >=0) && (y >= 0) ) 45 { 46 printf("pos: %d , %d\n",x,y); 47 48 switch (stage->at(y).at(x) ) 49 { 50 case 1: 51 { 52 FrameWork::Renderer_Sprite(view,tile,glm::vec3( (CELL * x) - (FrameWork::GetWindowSize().x / 2 - (CELL /2)),(FrameWork::GetWindowSize().y / 2.0f - (CELL / 2)) - (CELL * y),0),glm::ivec2(0,0),glm::ivec2(CELL,CELL)); 53 } 54 break; 55 } 56 } 57 } 58 59 } 60 } 61 62 63/* 64 for(int y = 0; y < stage->size(); y++) 65 { 66 for(int x = 0; x < stage->at(y).size(); x++) 67 { 68 switch (stage->at(y).at(x) ) 69 { 70 case 2: 71 { 72// FrameWork::Renderer_Sprite(view,item,glm::vec3(20,20,0),glm::ivec2(0,0),glm::ivec2(32,41)); 73 FrameWork::Renderer_Sprite(view,tile,glm::vec3( (CELL * x) - (FrameWork::GetWindowSize().x / 2 - (CELL /2)),(FrameWork::GetWindowSize().y / 2.0f - (CELL /2)) - (CELL * y),0),glm::ivec2(0,0),glm::ivec2(CELL,CELL)); 74 FrameWork::Renderer_Sprite(view,item,glm::vec3( (CELL * x) - (FrameWork::GetWindowSize().x / 2 - (CELL /2)),(FrameWork::GetWindowSize().y / 2.0f - (CELL /2)) - (CELL * y),0),glm::ivec2(0,0),glm::ivec2(24,31)); 75 76 77 } 78 break; 79 80 } 81 } 82 } 83*/ 84 85}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nob.

2022/02/04 03:01

成立しない場合のコードを提示してください。 そうでないと、成立しない場合の原因はわかりません。
guest

回答1

0

ベストアンサー

詳しい型が書かれていないので推測ですが、その状況で起こるのは符号無しの型に型変換されているように思われます。 整数型同士の二項演算の多く (足し算や掛け算なども) では原則として大きい側の型に調整されてから演算が行われる規則になっており、調整された後の型が符号無しであれば負数を想定した大小関係はおかしくなってしまいます。

c

1#include <iostream> 2int main(void) { 3 // これは偽値になる! 4 std::cout << (-1 < (unsigned long long int)0) << std::endl; 5}

投稿2022/02/04 02:59

SaitoAtsushi

総合スコア5466

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/02/04 03:16

GetPositon(),GetWindowSize()ともにglm::ivec2 つまりint型でpirntf("いいい");の式を(int)という形でキャストしたらうごいたのですがこれはなぜでどこかで変換されてしまうのでしょうか?
SaitoAtsushi

2022/02/04 03:55

stage->size() の型は何ですか? stage の型がわからないのでなんとも言えないんですが、標準ライブラリのコンテナの size は符号なしという規定があり、かつ普通は int より大きい型 (言語仕様上は小さい場合もあり得るのですが) なので全体としてはこの型に引きずられるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問