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

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

新規登録して質問してみよう
ただいま回答率
85.53%
配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

663閲覧

C言語における'?'の役割とは

HYYH

総合スコア16

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2023/10/24 09:51

編集2023/10/24 09:56

ある1次元配列の半値幅を求める関数を参考書で読みました。
17行目と24行目の'?'の役割が分かりません。
演算子かもしれないと思ったが、見つけられませんでした。
教えていただけませんか?

C

1double fwxm_lsf(float *p, int nx, double rt) 2{ 3 int i, mx; 4 double max, dx, fw0, fw1, hv; 5 6 max = p[0]; 7 for(i = 1 ; i < nx ; i++) { // 最大値とその座標の算出 8 if((double)p[i] > max) { 9 max = p[i]; 10 mx = i; 11 } 12 } 13 14 hv = max*rt; // 割合をかけた値の算出 15 16 for(i = mx ; (double)p[i] > hv && i > 0 ; i--); 17 dx = (p[i+1] == p[i]? 0.5 : (hv-p[i])/(p[i+1]-p[i])); 18 fw0 = i+dx; // 最大値から左側の幅 19 20// fprintf( stderr," max*%f=%8.1f,", rt, hv); 21// fprintf( stderr," p[%3d]=%8.1f, p[%3d]=%8.1f, fw0=%8.3f\n", i, p[i], i+1, p[i+1], fw0); 22 23 for(i = mx ; (double)p[i] > hv && i < nx-1 ; i++); 24 dx = (p[i-1] == p[i]? 0.5 : (p[i-1]-hv)/(p[i-1]-p[i])); 25 fw1 = i-1+dx; // 最大値から右側の幅 26 27// fprintf( stderr," max*%f=%8.1f,", rt, hv); 28// fprintf( stderr," p[%3d]=%8.1f, p[%3d]=%8.1f, fw1=%8.3f\n", i, p[i-1], i+1, p[i], fw1); 29 30 return fw1-fw0; 31}

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

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

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

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

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

otn

2023/10/24 11:38

> 演算子かもしれないと思ったが、見つけられませんでした。 「C 演算子 一覧」のgoogle検索でヒットした先頭の5件を見てみましたが、そのうち4件で記述があります。 どういう探し方をしたのでしょうか?
HYYH

2023/10/24 12:08

申し訳ございません。調べ方が下手でした。一つのサイトしか見てなかったので、気を付けたいと思います。
guest

回答2

2

ベストアンサー

3項演算子と呼びます.
17行目で言えばp[i+1] == p[i]が真のとき0.5,偽のとき(hv-p[i])/(p[i+1]-p[i])になります.
意図としては,p[i+1] == p[i]のときどうしても(hv-p[i])/(p[i+1]-p[i])が0除算になるので,これを考えた回避策と見れます.

投稿2023/10/24 09:54

編集2023/10/24 10:01
PondVillege

総合スコア1579

kurai, HidekoSaeki👍を押しています

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

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

0

このようなコード片を示して意味を求める質問は、ChatGPTなどのAI(大規模言語モデルによる対話システム)の得意とするところです。
試しにChatGPTに尋ねてみます。(ChatGPTは本家OpenAIのサイトの他、Edgeブラウザ上でBingで使うこともできるので今回はこちらを使いました)

質問文をほぼそのまま、C言語であることと問題の1行だけ抜き出したものを付け加えて尋ねてみます。

ある1次元配列の半値幅を求める関数を参考書で読みました。
C言語のコードで、次の'?'の役割が分かりません。
dx = (p[i+1] == p[i]? 0.5 : (hv-p[i])/(p[i+1]-p[i]));
演算子かもしれないと思ったが、見つけられませんでした。
教えていただけませんか?

返答は以下の通りでした。三項演算子または条件演算子という名前と簡単な説明が付き、妥当な回答です。示されたURLも1つを除き当該演算子に触れられており、ほぼ適切です。

はい、お尋ねの?はC言語の三項演算子(または条件演算子)です①②。この演算子は、条件 ? 式1 : 式2という形式で使われます。条件が真(非ゼロ)であれば式1が評価され、偽(ゼロ)であれば式2が評価されます。
あなたが示したコードdx = (p[i+1] == p[i]? 0.5 : (hv-p[i])/(p[i+1]-p[i]));では、配列pの隣接する要素p[i+1]とp[i]が等しいかどうかをチェックしています。もし等しければ、dxには0.5が代入されます。もし等しくなければ、(hv-p[i])/(p[i+1]-p[i])が計算され、その結果がdxに代入されます。
このように三項演算子は、一つの式の中で二つの異なる結果を返すことができるため、コードを簡潔に書くことができます。ただし、複雑な条件式を書くとコードの読みやすさが損なわれることもあるので注意が必要です。①②

https://acceliv.com/2021/05/clang-ternary-operator
https://webkaru.net/clang/conditional-operator/
https://www.sejuku.net/blog/23541
http://www.c-lang.org/operator.html

投稿2023/10/31 15:26

ikadzuchi

総合スコア3047

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

同じタグがついた質問を見る

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。