2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【初心者歓迎】C/C++室 Ver.77【環境依存OK】

1 :デフォルトの名無しさん:2011/12/12(月) 21:21:26.11
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.76【環境依存OK
http://hibari.2ch.net/test/read.cgi/tech/1312621728/

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

2 :デフォルトの名無しさん:2011/12/12(月) 22:01:55.18
>>999
型キャストがビットシフトの前に行われるのって
言語仕様でしたかね?

3 :デフォルトの名無しさん:2011/12/12(月) 22:22:29.78
JISX3010によると、
6.5.7 ビット単位のシフト演算子 意味規則 整数拡張を各オペランドに適用する。

らしいです。

4 :デフォルトの名無しさん:2011/12/12(月) 22:26:00.04
>>2
算術演算子の優先順位
ttp://www.bohyoh.com/CandCPP/C/operator.html

キャスト演算子の方がシフト演算子より優先順位高いですね。

5 :デフォルトの名無しさん:2011/12/12(月) 22:51:51.26
>>2,4 優先順位とか関係なくね?

6 :デフォルトの名無しさん:2011/12/12(月) 23:05:20.87
>>4
「暗黙の」型変換というところに引っ掛かりを覚えるのだが・・・


さらに言えば、ビットシフトとブール演算が右辺で複合的に行われた場合、それらのビットシフトやブール演算より先に
左辺の型を見て右辺の数をのこらず自動型変換って、期待していいものなのか?当てにしているとあぶなくないか?

7 :デフォルトの名無しさん:2011/12/12(月) 23:22:54.97
>>5
型変換が行われないと、桁あふれで右辺は0になる

8 :デフォルトの名無しさん:2011/12/12(月) 23:23:55.25
汎整数拡張
ttp://ja.wikipedia.org/wiki/%E6%B1%8E%E6%95%B4%E6%95%B0%E6%8B%A1%E5%BC%B5

9 :デフォルトの名無しさん:2011/12/12(月) 23:24:38.10
ん?>>3に書いてあるとおりじゃないか^^

c<<16の段階で、両辺が整数型にキャストされてる。
左辺 i が整数であるかどうかはまったく関係ない。
double d = c << 16;
のごとく書いても、cは整数型にキャストされるし
char s = c << 16;
のごとく書いても、cは整数型にキャストされる。
(そして結果はchar型にキャストされて面白い事になる)。

10 :デフォルトの名無しさん:2011/12/12(月) 23:31:55.62
>>7 整数拡張は演算子じゃないから、優先順位とか関係ないぜ。

11 :デフォルトの名無しさん:2011/12/12(月) 23:38:03.81
左辺をuint64_tにして右辺で4バイト超えるとこまでシフトしても、うまいことキャストするみたいなんだが・・・環境依存?
(単に整数型にするだけなら桁あふれでゼロ)

12 :デフォルトの名無しさん:2011/12/12(月) 23:40:00.07
>>9
intはint型と書いてくれよ。char型だって整数型なんだから。

13 :デフォルトの名無しさん:2011/12/12(月) 23:51:16.42
>>6-10
すんません。偉そうに教える程の知識は無いんですが、、、
「暗黙」だろうが「明示」だろうが、優先順位は変わらないと思います。
そして、式内では「精度の高い型」に変換されるので

i = c<<16;
は、うちは64bitOS(linux)
(1)16はint型とみなされる。
(2)c<<16 で右辺の16はint型なので、cは暗黙的にint型にキャストされる。
(3)i = c<<16 で左辺の(unsigned int)にキャストされる。
ってな感じだと思っていたのです。

・・・って、みなさんの言う、整数拡張ってwikiって見たら、
確かに演算子ではないですね。ということは、無条件に行われるから
優先順位が一番高いとも言えるのかな。

すっかり、ミイラ取りがミイラになっています。

とりあえず、多分、前スレ>>999さんは
unsigned char c;
unsigned int i;

c = 0xff;
i = (unsigned char)(c<<(unsigned char)(16));

printf("c: %x\n", (unsigned int)c);
printf("i: %x\n", i);
を期待されていたのでしょう。

14 :デフォルトの名無しさん:2011/12/12(月) 23:53:16.02
あ、アンカ間違えた
× 前スレ >>999
○ 前スレ >>997

15 :デフォルトの名無しさん:2011/12/12(月) 23:56:03.66
http://img.pics.livedoor.com/012/d/6/d6f87fce733d70932354-1024.png
http://mamorenihon.files.wordpress.com/2011/09/kao-demo1.jpg
http://blog-imgs-34.fc2.com/d/e/l/deliciousicecoffee/201108040637592d3.jpg
http://tantawan.blog.so-net.ne.jp/_images/blog/_13f/tantawan/E88AB1E78E8BE4B88DE8B2B7-18690.jpg
http://stat.ameba.jp/user_images/20110820/18/lisa-w-paz/07/00/j/o0500032111430159404.jpg
http://livedoor.blogimg.jp/news30over/imgs/c/3/c3860b80.jpg



16 :デフォルトの名無しさん:2011/12/13(火) 00:22:04.65
http://www.bohyoh.com/CandCPP/C/operator.html

今まで何の疑問も持たずに見過ごしてきたけど、順位が間違ってるね。
配列の添字[]は関数呼び出し()より順位が高いですよ・・・

17 :デフォルトの名無しさん:2011/12/13(火) 00:24:10.32
>>16
どんな式でその二つの優先順位の違いが問題になるの?

6 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)