C言語なら俺に聞け 156

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 9bb7-/QqT)
垢版 |
2020/09/28(月) 14:41:30.00ID:QxfbhGyV0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 155
https://mevius.5ch.net/test/read.cgi/tech/1589120427/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/10/11(日) 00:54:48.93ID:Oo+TUOYr0
>>42
一部誤っていたので訂正。

6.5.16 Assignment operators

3
An assignment operator stores a value in the object designated by the left operand.
An assignment expression has the value of the left operand after the assignment, but is not an lvalue.
The type of an assignment expression is the type the left operand would have after lvalue conversion.
The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands.
The evaluations of the operands are unsequenced.

なので代入式の値は「左辺式(left operand)に右辺式(right operand)の値を代入した後の値を右辺値(rvalueの意味)として評価した値」が正しかった。
2020/10/11(日) 00:55:54.98ID:y5Dl22i00
HNをNGに登録し、レス書いた奴ごとアボーンすると比較的すっきりする
128デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/11(日) 01:44:57.79ID:yV/54YAK0
>>126
意訳すれば「代入式の値は、左辺へ代入後に取り出してたら処理が無駄に重くなるから、代入直前の値を返すべき。返されるものは、左辺と同じ(値と型が)」
まあ端的に言うと、左辺が返されてると理解しとけばいいね。
2020/10/11(日) 07:57:55.20ID:Oo+TUOYr0
>>128
「左辺へ代入後に取り出してたら処理が無駄に重くなるから、代入直前の値を返すべき」なんて書いてない
脚注に

> 111) The implementation is permitted to read the object to determine the value but is not required to, even
when the object has volatile-qualified type.

とはあるが, どう実装すべきなどとは書いていないのだから, それは意訳ではなくお前の意見だ
130デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/11(日) 08:44:36.55ID:yV/54YAK0
>>129
いやく【意訳】
《名・ス他》原文の語句の一つ一つにこだわらず、全体の意味に重点をおいて訳すこと。その訳。
131デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/11(日) 09:21:01.70ID:yV/54YAK0
あと、そういうなら、君の書いた
>代入式の値は「左辺式(left operand)に右辺式(right operand)の値を代入した後の値を右辺値(rvalueの意味)として評価した値」
これだって君の意訳で意見だよね。

言葉は通じるためにある。ネット検索しても、世間一般的にも代入のことは副作用と呼んでるよね。
副作用を検索すれば「代入」という言葉が頻出する。
なので「The side effect of updating the stored value of the left operand」⇒ 代入 となる
次に、「(代入) is sequenced after the value computations of the left and right operands.」を訳すると「代入は両オペランドの値を処理後に行われる」となる。
つまり、「代入は最後に行われる」とは読めないかな? よって、返す値はその前に原則的に決まってるということ。
なので「代入した後の値を」という表現は違和感あるし、ワタスの代入直前の方が正解に近くはないかな?
まあ、ワタスは、C言語の超初心者なので、君の挙げてくれた英文を周辺状況と合わせて普通に読んでるだけだけども。

そもそも論だけど、仕様書のことを述べても、実装がその通りになってるとは限らないから意味ないよね。
2020/10/11(日) 09:24:54.54ID:1n9mnEAt0
>>120
ご返答有難うございます。
やはり、色々と複雑なようですね。
133デフォルトの名無しさん (ワッチョイ ea47-YQ4O)
垢版 |
2020/10/11(日) 12:23:08.94ID:kZXFoyze0
>>125
2020/10/11(日) 15:19:35.65ID:Ryz1amqZK
>>114
>一文字ずつ' 'の方法
その場合は最後に'\0'が必要
2020/10/11(日) 16:59:31.64ID:Oo+TUOYr0
>>131
阿呆かな?

>>128>>126の原文中に無く脚注で書かれている内容だしその脚注にも「左辺へ代入後に取り出してたら処理が無駄に重くなるから」などとは書かれていない

> 次に、「(代入) is sequenced after the value computations of the left and right operands.」を訳すると「代入は両オペランドの値を処理後に行われる」となる。
> つまり、「代入は最後に行われる」とは読めないかな?
正しい

> よって、返す値はその前に原則的に決まってるということ。
妄想

規格ではunspecified (実装の自由度)

> そもそも論だけど、仕様書のことを述べても、実装がその通りになってるとは限らないから意味ないよね。

逆だろ, 処理系を指定しないなら規格に従うしかない。
136デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/11(日) 17:27:29.04ID:yV/54YAK0
>>135
全部反論になってなくて、相手の言ってる言葉を都合のいいように解釈してるだけだね。
2020/10/11(日) 17:45:12.56ID:0ARGcdMRM
反論できないことは全部反論になってないで片付けるタイプ
2020/10/11(日) 17:51:10.03ID:jw/lLa/Ba
>>136
出先からで済まんな
妄想で仕様書を改竄する言い訳にはならんから注意しな
139デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/11(日) 17:52:06.99ID:yV/54YAK0
全然反論になってないし、第一、第一声が「阿呆かな?」と頭に血が昇ってる人の相手しても意味ないじゃん。
2020/10/11(日) 18:39:36.02ID:u/XktDCx0
意味ないのに書き込んじゃうのはなんでだろうね?
141デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/11(日) 19:03:18.63ID:yV/54YAK0
結局、原則的には、返す値は代入前に決まってるよね。gccもVC++もそうみたいだし。
2020/10/11(日) 19:54:22.88ID:vwOca/6s0
> > そもそも論だけど、仕様書のことを述べても、実装がその通りになってるとは限らないから意味ないよね。

> 逆だろ, 処理系を指定しないなら規格に従うしかない。

同感
2020/10/11(日) 20:21:00.36ID:qb0SAJQcM
まぁ過去の恨みで絡むのはやめとこうな
非建設的すぎる
2020/10/11(日) 21:19:40.64ID:qb0SAJQcM
一般論と規格の噛み合わない話が続いてるな
例えば日本語を表すのは大抵の処理系でshift jisかunicodeだが

一般論としてshift jisかunicodeだというと
規格として規定されてないみたいな
お互いの話してる主語が違ってて噛み合わない
2020/10/11(日) 21:45:50.38ID:/f4IUzXt0
>>144
下段の喩えが分かりませぬ。
2020/10/12(月) 17:32:23.08ID:Fn8G8w4j0
ファイルオープンできない
visualstudioにてfopen_s
err = fopen_s(&fp,"test.txt","r");
147デフォルトの名無しさん (ワイーワ2 FF82-YQ4O)
垢版 |
2020/10/12(月) 17:53:16.57ID:941JO02hF
FILE *fp;
なら
err = fopen_s(fp,"test.txt","r");
148デフォルトの名無しさん (ワッチョイ caf0-uZln)
垢版 |
2020/10/12(月) 18:26:02.48ID:YDN8KrDa0
ttps://qiita.com/softnakikaiya/items/dec17bd471913e1038a1
>>146
これ?
2020/10/12(月) 20:07:04.33ID:XcjAzDTUM
初心者にありがちなのは相対パスを理解してなくてファイルが無いから開けないってやつ
2020/10/12(月) 20:19:27.43ID:UculHi610
>>146
それじゃファイル開けないよ
第二引数にファイルパス指定してくださいクソが
151デフォルトの名無しさん (ワッチョイ ca93-Pfvf)
垢版 |
2020/10/13(火) 19:59:14.31ID:NHAZjg2T0
初歩的な質問で大変恐縮ですが、
平成6年度基本情報技術者試験のC言語について質問がありまして、

https://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H6b2/g11.html
問2のCですが、答えが2つありませんか?
ウでもエでもどちらでも正解の気がします。

コンパイルして両方の回答で試してみましたが、問題なく動きます。

なぜ答えがウになってエではいけないのか、どなたか知恵を貸していただけませんでしょうか?
2020/10/13(火) 20:23:51.05ID:FgDiRT1ia
146です。パス入力しデバッグしたら
なにかわけわからんBOX
でてきて思い通りになりません。
2020/10/13(火) 22:42:18.30ID:ciG+8HNI0
グローバル変数として宣言した変数j0とj1がmathcalls.hにもあるようで、コンパイルするとエラーが出ます
ヘッダファイルを書き換えずに回避するにはどうすればいいですか?
よろしくお願いします
2020/10/13(火) 22:43:11.29ID:b7C863zx0
>>151
エだと、60文字目と61文字目が' 'の行があるときに余分な改行が入る
2020/10/14(水) 01:03:48.89ID:9cyhkhnyp
モバイルC[C/C++コンパイラ]というアプリケーションを使っています
do~while()文で1!+2!+…+n!が1000を超える最初のnの値を求める問題です
以下の画像のどこが間違ってるか教えて頂きたいです
https://i.imgur.com/WEfqdXB.jpg
2020/10/14(水) 01:22:34.34ID:6pvowPnvM
どうなって欲しくてどうなってしまうかくらい書け
2020/10/14(水) 02:05:50.62ID:9cyhkhnyp
14と表示されてほしいのですが実行すると以下の画像のようになります
https://i.imgur.com/ztqzJy1.jpg
2020/10/14(水) 03:22:45.65ID:GZXcc9JpM
>>151
出題者が想定していた回答から察するに、「正しい答えを選べ」=「最適なものを選べ」という題意なんだろうね。
「エ」の場合、009〜012が必ず実行される。
「ウ」の場合、空白が連続していない場合のみ、009〜012が実行される。
なので「エ」よりも「ウ」の方が、実行時のコードが少なくなる可能性≒処理速度が速い≒より最適化されている。

ということで、「エ」を排しても「ウ」が選ばれるべき理由は説明できるけど、その逆は説明できそうになさげ
2020/10/14(水) 05:08:01.62ID:GZXcc9JpM
>>155
モバイルCのことは、よく知らないのだけど。
11行目を削除するか、↓のようにコメントアウト(行頭に // を追加)してみるとか。
// int fact(int n);

>>157
「1!+2!+…+n!が1000を超える最初のnの値」が「14」ということなのかな。
1!+2!+3!+4!+5!+6!=873
1!+2!+3!+4!+5!+6!+7!=5913
ということで(14ではなく)7あたりが正解であるように思える、なんとなくだけどね
2020/10/14(水) 05:26:43.66ID:z5Uy/Vd30
画像でコードを見せられても、テストできない

paiza.IO などに書いて下さい!
161デフォルトの名無しさん (ワッチョイ 9f93-ntOo)
垢版 |
2020/10/14(水) 06:30:51.16ID:8SMXEVrO0
>>154
>>158
回答ありがとうございます。
よくわかりました!
162デフォルトの名無しさん (ワッチョイ 9fa5-51Mc)
垢版 |
2020/10/14(水) 10:47:06.71ID:ssGc8zMA0
>>151
クソみたいなマルチポスト野郎だな
俺らはこういうゴミに手を貸してたのか
騙された気分だ

C言語について質問です。平成6年度基本情報技術者試験のC言語につ... - Yahoo!知恵袋
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12232834992
2020/10/14(水) 11:51:52.20ID:+mJN3MGTM
>>155
https://file3-d.kuku.lu/files/20201014-0239_c7aaeee8e9128bbdf0223997ba9de974.jpeg

#include <stdio.h>
int fact(int n){
  if(n==1)return 1;
  return n*fact(n-1);
  }
int main(void){
  int n=1,a=0;
  while( (a+=fact(n)) <= 1000 ) n++;
  printf("%d", n);
  }

普通に7って出たけど?
https://file3-d.kuku.lu/files/20201014-0239_d20849c5db09546cee5a312db4c7b83e.jpeg
2020/10/14(水) 13:06:19.00ID:8/BbynCKp
>>163
試したら7になりました、ありがとうございます
2020/10/20(火) 01:13:51.72ID:1WZYXiCK0
>>163
インデントがキモい
2020/10/20(火) 08:49:06.08ID:q8Z69frHa
systemのパスが通らない
ファイルに入力して
コンソールで表示する
プログラムだが
ファイルと同じパスでエラー
当方初心者
2020/10/20(火) 08:55:48.28ID:0IrscxF80
まずはその日本語をなんとかしろ
2020/10/20(火) 09:22:30.31ID:wzOsKsv00
>>166
パスって何か知ってる限り書いてみな
2020/10/20(火) 10:05:35.78ID:qYYfNILyM
>>165
んな事言われましても一応、HTML系の書き方なんで
https://ja.m.wikipedia.org/wiki/字下げスタイル
bannerスタイルは、ブロックのヘッダ部だけを字下げレベルで特別に目立たせるスタイルである。
ちょうど、K&Rスタイルでブロックの終わりの中括弧の字下げレベルを戻さないスタイルである。
2020/10/20(火) 10:22:20.38ID:wzOsKsv00
どっちもどっちだ
自分のスタイルと違うだけでキモいとか言い出すやつも
自分のスタイルを気に入らない人に言い訳するやつも
協調性を欠くという点で同じだ

プロジェクトに参入するたびに顰蹙かうやつ
2020/10/20(火) 10:32:37.64ID:qYYfNILyM
追い訳しますけど、質問者が読みやすいように
質問者のスタイルに合わせてあげたという事も忘れないで頂きたい。
2020/10/20(火) 10:49:54.94ID:2QIfR1k/H
質問者がそのスタイル使ったのは最後の行だけだ
意図して使っているわけではないのに無駄にマイナーなスタイルで答えるな
173デフォルトの名無しさん (ワイーワ2 FF3f-Vszw)
垢版 |
2020/10/20(火) 10:51:18.57ID:pHiz9StDF
>>166
ideone.com
pastebin.com
2020/10/20(火) 11:18:11.29ID:69CHk5Nl0
ここでは俺が無法者だ!!
2020/10/20(火) 15:12:59.44ID:aEz3U6LC0
環境変数PATH なら、; 区切り。
PowerShell で以下を入力してみ

$env:Path.split( ";" )
2020/10/21(水) 10:15:31.31ID:KGhWJPjI0
>>172
このスレにコーディング規約がある訳じゃないんだからスタイルは回答者の自由だが
177デフォルトの名無しさん (ワッチョイ 02a5-F5SX)
垢版 |
2020/10/21(水) 10:45:56.94ID:CZ2/iovY0
わかったわかった
お前はキモい、もうそれでいいよ
キモいことを自覚してそのスタイルを使い続けてくれ
心理的にダメ、気持ち悪いんだよお前
2020/10/21(水) 11:02:14.79ID:nW5Wnc+BM
おまえツイッターでも文脈見ずにクソリプばっかりしてるだろ
2020/10/21(水) 12:17:24.48ID:EPxGxCCv0
MinGWをインスコしてあれば
path | sed "s/[=;]/\n/g"
2020/10/21(水) 16:41:05.37ID:gYHxZT9P0
>>155
エラーメッセージからするとmain()関数内部でfact()関数の宣言を
書いていることが原因らしい。
素朴なCだと、そう書くとまだ名前が宣言されて無いグローバル関数を
main()関数内部で使えるようにする意味になるが、現在のC/C++だと
それぞれのコンパイラが独自に拡張したりした結果、
「(関数内部における)内部関数」なるものが使えるコンパイラが出てきたため、
意味が違ってしまっていることがある。
今の例の場合、main関数の中で後から定義するfactという名前の関数を先に
宣言する意味だとコンパイラは認識してしまっている可能性が高い。
だから、main関数の中にfact関数の関数定義が書かれて無いのでそのような
エラーが出る。
もし、素朴なCのプロトタイプ宣言にしたい場合、
main()関数の外側に書くのが普通だが、なんらかの事情でmain()関数の内側に
書きたい場合には、
int main(void){
 extern int fact(int n);
 ・・・
}
のようにexternキーワードを書くと通ることがあるかも知れない。
2020/10/21(水) 16:52:54.92ID:EPxGxCCv0
関数のブロック内に関数原型があるのは完全に合法
実用上まず使わないけどね
2020/10/21(水) 17:02:00.07ID:gYHxZT9P0
>>181
もとは合法だったが、それぞれのコンパイラが独自拡張をした結果、
意味が変わってしまってる場合がある。
2020/10/21(水) 17:14:09.48ID:EPxGxCCv0
日本語でおk
2020/10/21(水) 17:17:08.30ID:vNonm69Zd
>>182さん、思い込みが激しすぎて証拠がないのに持論を主張する。
2020/10/21(水) 17:58:35.70ID:gYHxZT9P0
gccなんかは関数の中に内部関数を作れる。
だから、関数内でプロトタイプ宣言を書くと元定義の pure Cとは
異なった意味になる可能性が高い。
2020/10/21(水) 18:02:50.56ID:gYHxZT9P0
>>184
現にその宣言が無ければコンパイルが通り、有ればエラーになっている。
それが一つの根拠。
実験してみたわけじゃないがそれらが本当におきているとすれば
入れ子関数(内部関数)の独自拡張が原因だと洞察できる。
2020/10/21(水) 18:05:50.18ID:vNonm69Zd
>>186
再現可能な最小コードを用意して下さい。
2020/10/21(水) 18:11:05.50ID:gYHxZT9P0
他の人の実験結果から推定しているだけだから、事実かどうかは分からんよ。
2020/10/21(水) 18:23:13.18ID:vNonm69Zd
モバイルCっつー奴にバグ報告せよ。
2020/10/21(水) 18:35:10.36ID:gYHxZT9P0
PythonやLuaもサポートしているが、Clang, LLVMという言葉があった。
使ってるコンパイラはClangなのかな?
2020/10/21(水) 20:31:51.31ID:z1b04ciPa
簡単な質問申し訳ないです。
漢字を文字コードにて受け
putcで標準出力できるかな?
2020/10/21(水) 20:57:42.76ID:GehgBoqYM
もちろんできるけど、
入力される文字コードの種類と出力する文字の符号化方式は何にしたいか分かってるの?
2020/10/21(水) 21:05:35.53ID:Cabs0W0/M
文字が文字コードで扱われるのは普通の事だ
画像とかではないなら
194デフォルトの名無しさん (ワッチョイ 6247-YvdE)
垢版 |
2020/10/21(水) 22:53:14.42ID:sHBY55kz0
putw
putwc
2020/10/21(水) 23:01:37.11ID:T/uvMZ2i0
全角文字はマルチバイト文字かUnicode文字。
196デフォルトの名無しさん (ワッチョイ 0d01-LA9s)
垢版 |
2020/10/22(木) 04:18:40.19ID:OxqRNNZs0
フリーランス向け報酬即日払いサービス『先払い』が、オンライン資金調達プラットフォーム『資金調達freee』β版に掲載開始
https://prtimes.jp/main/html/rd/p/000000037.000047439.html
フリーランスやパラレルワーカー同士のマッチングプラットフォーム「conema」が、
案件依頼・仲間募集を中心とした掲示板機能(β版)をリリース!
https://prtimes.jp/main/html/rd/p/000000004.000059389.html
フリーランス薬剤師専門エージェントサービス「きょうりょく薬剤師」、リリース開始。薬剤師の新しい働き方を提唱。
https://prtimes.jp/main/html/rd/p/000000002.000058526.html
中卒、新聞配達員から月収4億の不動産王へ。姫路の不動産王の投資哲学
https://hbol.jp/184178
【アプリ開発で起業】必要な心得とマネタイズ方法のすべて
https://www.dreamgate.gr.jp/contents/column/application-development
副業を認める企業に対して「より魅力的に感じる」人は6割以上。
一方、副業を認めない企業に対する魅力度は6割超が「低下した」と回答
https://prtimes.jp/main/html/rd/p/000000016.000040832.html
みんなが知らない「サラリーマンの生存戦略」副業年収1億円!motoさん伝授
https://diamond.jp/articles/-/247070
2020/10/24(土) 23:58:39.57ID:3PXn8xmW0
なぜ
int* a = 0;
*(PBYTE*)&a += 5;
は動作するのに
int* a = 0;
(PBYTE)a += 5;
はエラーになるのですか?
2020/10/25(日) 00:02:11.04ID:TZHfVi9W0
>>197
(PBYTE)a += 5;

どこに5を加算していると思う?
2020/10/25(日) 00:12:03.26ID:5nJTYzvV0
>>198
キャストしているとはいえ、ポインタaに加算していると思うのですが、、
ポインタはアドレス0を指しているので、加算することによってアドレス5を参照したいのですが
なぜかエラーが出てしまうのかわかりません..
2020/10/25(日) 00:42:02.50ID:LNYSWk6n0
それだけじゃ参照してないしエラーなんてならなそうだけど
いつどんなエラーになるの?
参照した時?なら、5番地を読んでいい環境なの?
windowsやlinux等高級なOS上なら、絶対番地を勝手に読んじゃダメだよ
2020/10/25(日) 00:46:43.39ID:TZHfVi9W0
(PBYTE)a は 変数ではなく、値になる
2020/10/25(日) 00:51:22.10ID:5nJTYzvV0
>>200
コンパイルエラーになるんです。
エラー内容は"式は変更可能な左辺値である必要があります"です。
このコードはここに投稿するためのテストのために書いたコードなので、
参照関係の問題は理解しています。
*(PBYTE*)&a += 5;

(PBYTE)a += 5;
はやってることは同じと思うのですが、なぜエラーになるのかなと。
そういうものとして理解するしかないのでしょうかね
2020/10/25(日) 00:57:14.44ID:TZHfVi9W0
*(PBYTE*)&a =

変数aの現在の値を&で取り出し、
それをポインタ値として扱い、
そのポインタ値が指し示すところに代入する
ということじゃないかな
2020/10/25(日) 01:18:53.38ID:TWzqhGL8M
(PBYTE)a みたいにキャストすると、値の解釈の変更ということになり、
代入先(左辺値)にはできなくなる。

int i;
(float)i = 1.1;
って意味あると思う?
2020/10/25(日) 01:33:16.78ID:5nJTYzvV0
あ〜〜 なるほど
floatなどの小数点以下を扱う型は以下のようにdが1になる特別な仕様があるから
そのためにエラーになるようになってるんですかね。
float c = 1.5f;
int d = (int)c;
int e = *(int*)&c;
この場合、dは1になるけど、eは1069547520になるから、
エラーになる現象はこれと近いのかな
この解釈であってるのだろうか
2020/10/25(日) 01:35:55.99ID:TWzqhGL8M
それそれ。
それ追記しようとしてた。
2020/10/25(日) 01:54:40.07ID:5nJTYzvV0
とはいえ
int i;
(float)i = 1.1;
これはiを一時的にfloatにキャストしてるだけだから、エラーにせずにiは1として動作させるとこはできなかったんだろうか
2020/10/25(日) 02:21:39.27ID:COZe3KfC0
>>202
「なぜエラーになるのか」はエラーメッセージに出てる。
理解を深めたいなら、エラーメッセージのどこがわからないのか(どこまでわかってるのか)を言ってもらわないと。
2020/10/25(日) 02:57:11.72ID:5nJTYzvV0
>>208
そもそもなぜコンパイラがこれをエラーと捉えるのかというのがわからないと言う意味で言っておりました。
2020/10/25(日) 03:00:35.23ID:COZe3KfC0
>>209
http://kikakurui.com/x3/X3010-2003-01.html#71
> 制約 代入演算子の左オペランドは,変更可能な左辺値でなければならない。
2020/10/25(日) 03:18:58.54ID:COZe3KfC0
>>207
ルールがこうなってる理由がわからないという話なら、それは
(float)i = 1.1 が i = 1 と同じになるようにルールを複雑化させてもそれに見合うほどうれしくないから、ね。
2020/10/25(日) 03:28:10.91ID:UGl+6vH40
>>202
キャストの結果は常に右辺値
右辺値を代入してるから右辺値には代入出来ないというエラーが出る
ポインタのデリファレンスの結果は左辺値なので代入も問題ない

あとエスパーするにPBYTEってuint8_t (unsigned char)なんだろうけど(それ以外の場合はデリファレンスの結果が未定義),

> *(PBYTE*)&a += 5;

はint型の先頭バイトを書き換えたいという意図で,

> (PBYTE)a += 5;

こっちはメモリのどの位置を書き換えたいのか自明じゃないからやってること自体全く異なる
2020/10/25(日) 08:17:29.39ID:B8Qi0Gue0
キャスト式の結果は左辺値ではない
間接演算式の結果は左辺値となる

これだけのことだろ
2020/10/25(日) 09:56:54.64ID:63196X630
gcc3 の頃までは cast-as-lvalue が有ったけど 4 になるときに廃止された。
古いコードでこの機能をあてにしているものはあるかもね。
215デフォルトの名無しさん (ワッチョイ fd5f-Naer)
垢版 |
2020/10/25(日) 13:18:04.05ID:FzqccguI0
>>197
(PBYTE)*a += 5;
216デフォルトの名無しさん (ワッチョイ fd5f-Naer)
垢版 |
2020/10/25(日) 13:19:58.42ID:FzqccguI0
>>202
答えだけ言うとやってることが同じではない
2020/10/25(日) 16:44:12.86ID:5nJTYzvV0
>>215
(PBYTE)*a += 5;
これはaのポインタが指す値に5を加算しているのではないでしょうか?
なので
*(PBYTE*)&a += 5;
と同じではないと思うのですが
218デフォルトの名無しさん (ワッチョイ fd5f-YvdE)
垢版 |
2020/10/25(日) 16:58:46.13ID:FzqccguI0
(PBYTE *) って (BYTE **) のことか
それなら同じじゃないな

っていうか「左辺値が変更出来ない型になってる」
これでこの話は終わり
2020/10/25(日) 17:29:39.65ID:0u/0rMBT0
それなら「左辺値」ではなく「左辺」だろう
2020/10/25(日) 18:23:36.88ID:63196X630
>>217
型とは独立して (一部関係もあるが) lvalue (左辺値) と rvalue (右辺値) という概念があるってのは理解できてる?
たとえば

int x=5;
x = 2;

と書いたら OK だけど

5 = 2;

と書いたらもちろん NG だというのはわかるよね。
変数は評価したら値が出てくるけどそれとは別に場所としての性質も持ってる。
場所と値としての性質を併せ持っているのが lvalue なんだ。

で、キャスト演算子を適用するというのは取り出した値に対して型変換することになるので、
型変換した結果は場所としての性質が失われてしまう。
つまり lvalue ではなく rvalue になってしまってこれは代入先としては有効ではない。

---- 余談 ----

実際には代入先は lvalue の中でも特に modifiable lvalue (変更可能な左辺値) である必要があって
そのあたりの詳細は 6.3.2.1 あたりに記述がある。
http://kikakurui.com/x3/X3010-2003-01.html#page38-div
221デフォルトの名無しさん (ワッチョイ 82ad-EeCs)
垢版 |
2020/10/26(月) 03:47:15.23ID:zDyo5E1K0
>>191
出力する端末が漢字を出すような端末で、尚且つその端末で漢字とされるコードを引き渡すのであれば出る。
しかしメジャーな文字コード体系で1バイトだけで漢字を表すようなものはなく、そういった端末も(おそらく自作しない限りは)ないだろうから putc() 1回だけで漢字が出ることはまずないと思う。
2020/10/26(月) 07:27:20.32ID:ddH/1NYY0
>>217
間接演算子は単項なので、代入演算子よりも先に結合する
よって意味的にはこうなっている
((PBYTE)(*a)) += 5;
2020/10/26(月) 09:07:00.12ID:ePNtOm9AM
>>215 >>222
恥ずかしいから出てくるな
2020/10/26(月) 09:39:14.29ID:ddH/1NYY0
>>223
ん? 俺は、おまえさんに恥をかかせたのか? そういう意図はなかったが
2020/10/26(月) 10:11:22.50ID:ePNtOm9AM
>>224
最初の質問が
*(PBYTE*)&a += 5;
(PBYTE)a += 5;
の違いなのに、
(PBYTE)*a += 5;
を解説するというトンチンカンで質問者を困らす回答見せられたら、
質問者に申し訳ないし同じ回答者としてこっちが恥ずかしくなるわ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況