これを考えるにはコンパイラ側を理解しないといけない 自分はC++人間なので下記のように考えるけど。 +=はアセンブリ(機械語)にも存在する計算なのでそのまま変換される と言うよりむしろ a = a + b だと temp = a temp += b a = temp っていうコードに変換される ちなみにこのことからa = a + bよりa += bの方がやや高速ってのは有名な話 なのでs += val + ++sは temp = val temp += ++s s += temp になるので17 あと、計算の順序(結合規則)としては基本、左から右(一部の演算子は右から左)なのでa + b + cという処理があればコンパイラは(a + b) + cと解釈する これ、C++の常識ね() てか16を出す言語があることが衝撃 ワカリニクイ
できるようになるための知識ではなくやらないようにするための知識
逆にAIに実行結果を書く発想がよくわからない…
これTwitterで見たけど、こんなん出題してどうするねんって感じよな
ChatGPTならPython実行できるからいいかなぁと思ったり()
うぽつです。
何らかの未定義動作踏んでそうだなと思いました。
その式の評価順序が定まってるのだとしたらだいぶ重箱の隅感ありますね笑
17がどっから出てきたのか分からなかったのですが、言語によるのですね。初めて知りました。
「パッと見て解らんのは書くな!
お前だけが解ってるのは、それは単なるメモ帳でしかない!他の人間が見て解らないのは、せん○りで、やってる本人は気持ちいいかもしれんが端から見たらキモいだけだ!」
機械の作業マニュアルを書く時の鉄則ですかね。
6÷2(1+2)と同じで聞く側の解釈で変わるのは書くなとw
これ本当にそう
昔いた会社で自己満足のコード書く奴がいてはらわたが煮え繰り返った
答えはずんだもんの鼻から悪魔が飛び出すなのだ
調べたらJavaは言語仕様で順序が決まってるから環境に寄らないらしい
Cは未定義動作でコンパイラの最適化で入れ替わったりするらしい
ただそもそもコンパイルで警告出るからまともな職場なら製品には入らん
“s+= “の部分を見た時に、”s+=”のまま処理するものと”s=s+”に読み変えて処理するものの2通りがある…のか?
不思議だなあ…
+=の前を先に評価するか、+=の後を先に評価するか、の違いですね。
学生は自分でコード評価せずに回答として出すから困る(できない子に限ってする)
Cはコンパイルすると直で機械語になるから最終的に出力される機械語をイメージすると何故17になるか分かりやすいかも。
&sに1加算→&sの値とvalueの合計をレジスタに保存→&sの値とレジスタの値の合計を&sに保存みたいに翻訳されると17になって当然と言える。
C以外は右辺のインクリメントをただのs+1として中間コードに翻訳してそう。(javascriptは知らんけど)
Pythonがインクリメントの使用を封じてるのはこういう例があるから?🤔
まずこんなコード書くな
angular、typescriptが苦手すぎて求める動きにならない実装内容に対して、どう修正すればいいのかわからないときに
駄目元でCopilotにあれこれ聞いてみたらやり取りは多かったが
解消できたことが最近あってAI馬鹿にならないなと感心した。(どうせ答えにならず、頓珍漢なこと言ってくるんだろうなと思って期待してなかった)
アシスタントとか、講師をイメージして使うと結構いいもんなんだなと。
評価順序が違うのでこうなるんですね、Javaは+=の評価順序が左から右なのではじめのSは6でC/C++は右から左なので先に++Sが実行されるので7になるということですねぇ。
Javaやばいな・・・
これを考えるにはコンパイラ側を理解しないといけない
自分はC++人間なので下記のように考えるけど。
+=はアセンブリ(機械語)にも存在する計算なのでそのまま変換される
と言うよりむしろ
a = a + b
だと
temp = a
temp += b
a = temp
っていうコードに変換される
ちなみにこのことからa = a + bよりa += bの方がやや高速ってのは有名な話
なのでs += val + ++sは
temp = val
temp += ++s
s += temp
になるので17
あと、計算の順序(結合規則)としては基本、左から右(一部の演算子は右から左)なのでa + b + cという処理があればコンパイラは(a + b) + cと解釈する
これ、C++の常識ね()
てか16を出す言語があることが衝撃
ワカリニクイ
「インクリメント・デクリメントは単体で使え」と言われる理由がよく分かりますね
16かと思ったら17もあるのか、めんどい
こんなクソコード実際に使ったりするのかな
ガッ
少なくとも実務でこれは…
S += val + s++; / このようにsの前か後ろにインクリメンタル記号を置けるのがおかしいのだ。
s = 10; s += (s = 3) とやった場合もおそらく大勢の言語は 13 を返すと思うのだ
副作用か
こんなクソコードに出会う事がレアだからその時に言語仕様調べればいいような。
意地悪問題でしかないw
こんなクソコードPRしてきたら秒で却下する自信がある(たまにいるから困る
そういや-5 % 3や5 % -3も言語によって違いますが、なんかBronzeあたりで絶対値最小剰余の仕様をきかれたりしてそうですね。
Bronzeでこんなの出るのか。
s += val + s
も気持ち悪いな
s = val + s + s
ならまだわかる
ふむふむ
サムネ見て 16
いちおう正解?
言語によって違うんだ……