#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

inline int max(int x, int y){x = x>y ? x:y; return x;}


これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/01/12 13:24

三項演算子と言います

    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/01/12 13:23

>finalanswerの回答に補足です。


ああ、「さん」が抜けてしまった…

finalanswerさん、ごめんなさい。
    • good
    • 0

finalanswerの回答に補足です。



>したがって、「x = x>y ? x:y; return x;」は、以下の文と同値です。
>if (x <= y) {
> x = y;
>}
というのは、間を一段階抜かして書いてあります。

省略せずに書くと、…

…以下の文と同値です。
if ( x > y ){
 x = x;
}else{
 x = y;
}
return x;
しかし、最初の複文の中では何もやっていないので、この部分を省略し、
if (x <= y) { …

…となります。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/01/12 13:24

「x = 条件 ? A : B」という文法は、if-else文の特殊な用法で、


if (条件) {
 x = A;
} else {
 x = B;
}
と同値です。
したがって、「x = x>y ? x:y; return x;」は、以下の文と同値です。
if (x <= y) {
 x = y;
}
return x;
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/01/12 13:25

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q英語版 Windows XP Proffesional x64 Edition からの日本語入力の問題

イギリスの大学の研究室で使用しているコンピュータから日本語入力、また日本語で書かれたPDFの閲覧ができないので大変不便で困っています。このコンピュータのOSは Windows XP Proffesional x64 Editionで、もちろん海外使用です。 また、Microsoft Office 2007 がインストールされています。
Office XP Tool: Japanese Language Pack と Office XP Tool: Global IME (Japanese)というのをインストールしようと思ったのですが、これはWindows XP Proffesional x64 Editionに対応していないようです。
どなたかこのようなことにお詳しい方がいらっしゃれば是非解決方法を教えてください。

ちなみにこの文章は自分のノートパソコンから入力したものです。

Aベストアンサー

Win XP Pro 64 英語版 日本語 入出力 site:microsoft.com
としてサーチすると
Multilingual User Interface Pack: MUI があり、これを追加する形の方が良いのではと思われます。

個人向けではなく、Volume license形式で会社対応とされていますが、個人でも3-5license単位から買えるようです。

http://technet.microsoft.com/ja-jp/library/cc835604.aspx
Windows XP Professional の多言語機能

http://www.geocities.jp/hpt_user99/vl.html
ボリュームライセンス

英国でも入手可能なはずですから、64bit版に対応しているか等確認のうえ購入されるのが良いと思います。
値段もそんなに高くないはずです。

 

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

QJapanese-made camera

日本製のカメラをJapanese-made cameraと言いますよね。ふと思ったんですが、Japan-made cameraとは言わないのでしょうか?

複合語 "X-made" のXのところには、例えばslightly-made man(体つきのほっそりした男性)のように副詞がくる場合は理解できます。でも、形容詞がくるというのがピンときません。むしろJapan-made cameraのようにXに名詞が来るというのならわかる気がするのですが。

どなたか説明していただけませんでしょうか。

Aベストアンサー

補足がありましたので思いついたことを追加します。

私はGoogleでいろんなパターンを確認していましたが、Japan-made productというのは試していませんでしたね。

結局のところ好みの問題だと思うのですが、UK、USAは政治的境界と地理的境界が、UK-British、USA-Americanでずれがあるのでそういった使い分けもあるでしょう。

形容詞-made(準動詞) 名詞のパターンが多いのは、誤解を避けるという意味合いもあるのかもしれません。

名詞-準動詞-名詞の並びだと、たとえばこんな文で
Do you know(any)Japan made camera like this?
Do you know(any)"Japan made camera" like this?
ではなく、anyがないと特に
Do you know that Japan made (a) camera like this?
のようにJapan made cameraの部分が主語-述語-目的語に感じられたり、そうでなくてもJapan(名詞)の部分で文章の要素が出そろってしまい、made以下がJapanの修飾語(Japan which is made・・・)のように思えることもあるでしょう。

そういった意味では、Japanese made cameraなら、前に主語述語があって無意識に目的語を探しているときにJapaneseで引っかかることなく形容詞→形容詞→目的語
と到達できそうです。
もちろんこれしきの複合形容詞で引っかかることはないでしょうし、話し言葉では明らかに文の切れ目が違うので、ややこじつけがある説明だと思います。

Japanese-made cameraは、japanese cameraに補足的に、単なる日本製品ではなく「日本で製造された」という意味を出すために、madeを補っていると考えれば、形容詞-made cameraでも不自然ではないと思います。Japanese (製造は:made)camera
foreign-owned businessesも、foreign (資本的には:owned)businessesということではないでしょうか?

こじつけてきな文法的説明は可能ですが、特にこの手のハイフンで結んで長い形容詞を作るものに明確なルールはないと思います(ハイフンすら省略可能ですので)ので、好みの部分が大きいのではないかと思います。

余談:
私もfwkk8769さんと同じくJapaneseは「日本人」を表わす名詞ではなく形容詞だと思います。
Turkish-made craft とは言いますが、Turk-made craftというのは???です。
(Turkey:トルコ(国名)、Turkish:トルコの(形容詞)、Turk:トルコ人)

補足がありましたので思いついたことを追加します。

私はGoogleでいろんなパターンを確認していましたが、Japan-made productというのは試していませんでしたね。

結局のところ好みの問題だと思うのですが、UK、USAは政治的境界と地理的境界が、UK-British、USA-Americanでずれがあるのでそういった使い分けもあるでしょう。

形容詞-made(準動詞) 名詞のパターンが多いのは、誤解を避けるという意味合いもあるのかもしれません。

名詞-準動詞-名詞の並びだと、たとえばこんな文で
Do you know(...続きを読む

Qint rev_int(int num)文  関数の入門

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転した値を返す*/

intrev_int(int num)
{


inttmp = 0;

if(num> 0){
do{
tmp = tmp * 10 + num % 10;
num /= 10;
}while (num > 0);

}

return (tmp);

}

int main(void)
{

int nx = scan_uint();

printf("反転した値は%dです。\n", rev_int(nx));

return 0;

}

教えてください!参考書に書いてあることをまとめて
プログラムを読んでるのですが、わからない部分があります。
(1)まずint scan_uint(void)からこのプログラムは読み込んでるのでしょうか? どこかのサイトを調べたら、最初にint mainからプログラムは
読み込むというのを観たのですが、コンパイルして実行した動きをみるかぎり一番最初はint scan_uint(void)から読んでるように見えます。。。

(2)int scan_uint(void)の文は理解できました。私なりに解釈したのは
ここでは正の数を入力しないと次に進まないことと
負の数を入力した場合、負の数を入力しないでくださいと注意がずっと
でるという文です。
質問ですが、このあとint rev_int(int num)文に移ると思うのですが
ここの int tmp = 0; これはこのint rev_int(int num)文のみの
tmpの箱と参考書に記載がありました。つまり int scan_uint(void)で
出てきたtmpとは別個と解釈しました。

そうなると、int rev_int(int num)文を読んでみると

tmpの箱を作成。そこは0を代入。
if文で num>0の時、 do文に入る (ここでいうnumは int numと宣言してないですけど、またscanfとか作って値はまだいれてないですけど??)

do文は
tmp = tmp*10 + num %10
num /=10
wile(num>0)

これを見る限り、numという箱が見えません。全体を見渡しても
どこかでnumに値が代入されたのち、このint rev_int(int num)
という文を読みこんでいき if num>0のときと宣言されていますが
もっと前の段階でnumの値が入力されていない限り
このif文は適用されないと思ったのですが、プログラムは動いてます

三つ目の質問です
tmp = tmp *10 + num % 10
num /=10 の部分がわかりませんでした。
tmpはまず、int scan_uint(void)で作成したtmpと
int rev_intで登場してきたtmpとは別個と参考書に書いてあるのが
正しいのであれば
tmpの値はここでは初のはずです。
一体いつ値を入力したのでしょうか?
もしも一番最初のscanfの時に入力した例えば12345が此処でも適用されるなら tmp = 12345 ×10 + num % 10を tmpに代入するって文になりますが
どうしてtmpを10かけるのですか?123450になり、
そのあとnumの値が此処でもまだ不明なのですがnum/10したものと
足すみたいですが、わかりませんでした。。。

まとめると、tmp = tmp*10+num%10がわかりません。
また、numとは何かわかりません、値もどの値がどこで代入されていて
while(num>0)が引っかかるのか不明です。
tmpはint scan_uint文内で入力した値(scanfの部分で)
12345と仮に入力したら、それは次のint rev_int(int num)でも続いて活用されてるのですか?
参考書はなぜ別個と書いてるのかわかりません。

ごめんなさい>_< とても長くなりました。
どなたか解る方、教えてください、よろしくおねがいします。

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転...続きを読む

Aベストアンサー

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き始めます。

main関数で

int nx = scan_uint();
printf("反転した値は%dです。\n", rev_int(nx));

と、それぞれの関数を呼んでいるので、実際の動作を実行順に羅列すると
1.必ずmainの先頭からプログラム開始。
2.mainからscan_uintが呼ばれる。
3.呼ばれたscan_uintが処理を行う(内容は理解しているようなので省略)
4.scan_uintからmainに帰ってくる。その時の戻り値がnxに入る。
5.printfの引数にrev_int(nx)があるので、nxを引数にしてrev_intを呼ぶ。
6.呼ばれたrev_intは、nxの値をnumとして受け取る。
7.rev_intは受け取ったnum(mainのnxと同じ値)を元に処理を行う。
8.rev_intはtmpに作った値を戻り値として関数を終わる。
9.rev_intからmainに帰ってくる。その時の戻り値がprintfの引数になる。
10.mainからprintfが呼ばれる。
11.呼ばれたprintfは何かを画面に表示し、関数を終わる。
12.printfからmainに帰ってくる。printfの戻り値は受け取ってないので捨てられる。
13.mainがreturn 0;で関数を終わらせ、プログラムが終了する。
となります。

>これを見る限り、numという箱が見えません。全体を見渡しても
上記の6.で「引数の実体として、mainから渡してもらってる」でしょう?

それが判らなかったのは「プログラムはmainの先頭から実行する」と言うのを理解できていないからです。

(3)
>tmp = tmp *10 + num % 10
>num /=10 の部分がわかりませんでした。
>どうしてtmpを10かけるのですか?123450になり、
123450にはなりません。

rev_intに入ってきたら
int tmp = 0;
ってやってるので、tmpは「最初は0」です。別の場所(scan_uintなど)にあるtmpは「同姓同名の赤の他人」なので忘れましょう。

scan_uintで「12345」を入力すると、12345がmainのnxに返って来て(nxが12345になって)、そのnxの値である12345がrev_intに渡され、rev_intは12345をnumに受け取ります。

つまり「最初は、numは12345、tmpは0になっている」のです。

そして、numが0かどうか調べます。

numが0でない(12345になっている)ので、次に
tmp = tmp *10 + num % 10;
を実行します。

tmp(中身が0)を10倍した値と、numを10で割った余りを足し、tmpに戻しています。

つまり0を10倍した0に、12345を10で割った余り5を足し、足した結果5をtmpに戻します。なのでtmpは5になります。

次に
num /=10;
を実行します。

これは「numを10で割って、numに戻す」です。
num = num / 10;
と同じです。

numは12345なので、10で割った商1234がnumの新しい値になります。

なお、Cでは、整数の割り算の答えは「商」だけです。小数点以下はありません。例えば、1を10で割ると0になります。

次は、while文で「numが0より大きいなら繰り返し」です。

numが0より大きい(1234になっている)ので繰り返すことになり、また
tmp = tmp *10 + num % 10;
を実行します。

tmpは5になっているので10倍して50、それにnum(1234)を10で割った余り4を足し、足した54をtmpに戻します。

次に
num /=10;
を実行します。

numは1234なので、10で割った商123がnumの新しい値になります。

これを「numが0より大きい間、繰り返し」すると

tmp=0、num=12345

tmp=5、num=1234

tmp=54、num=123

tmp=543、num=12

tmp=5432、num=1

tmp=54321、num=0

となり、numが0になって繰り返すのをやめた時、tmpは54321になっています。

そして、最後に
return tmp;
として、54321をmainに返します。

mainに帰って来ると、前述の9.~11.の処理で
反転した値は54321です。
と表示されます。

>参考書はなぜ別個と書いてるのかわかりません。

「別の場所にある、同じ名前の変数は、同姓同名の赤の他人」なので「別個」です。

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き...続きを読む

QNever feed your hamster raw potatoes. (Similarly/A

Never feed your hamster raw potatoes. (Similarly/As well), never feed it rhubarb leaves.
正解はSimilarlyですがどちらも同様にのような意味なのですが、As wellは副詞句なので文頭、文中、文末にも置けそうですし。なぜSimilarlyが正解か教えてください。

Aベストアンサー

as well というのは、
A as well as B で「B と同様に A も」がもとにあって、
as B が自明で(とか前にあるので)省略された形です。

だから、A as well で「A も同様に」という表現です。
つまり、「~も」という同様となる「~」が as well の前に来ないといけません。

Qreturn 0; return 1; まで同じ

#include <stdio.h>
int main()
{
printf("%d %c\n", 65, 65);
return 0;
}
 コンパイル後は
65 A
 return 1;も同じでした。
しかし
 return 2;すると
 Exited: ExitFailure 2  終了しました:出口の失敗2 となります。
 2以上でしたら、出口が塞がるのでろうぐらいしかわかりません!?
 
 どんなバクなのでしょうか!?
 よろしくお願いします。

Aベストアンサー

C 言語の仕事は「0 なり 1 なり 2 なりを返す」までであり, その値にどう対処するかは (「C のプログラム」としては処理を完全に終了しているので) C のあずかり知らぬところです.

なので, 「どんなバクなのでしょうか!?」というのはあなたの使っている OS なりシェルなりなんなりに聞いてください.

Q非表示にしたい,Adobe Reader X

無償ソフトの Adobe Reader X (10.1.17)-Japanese を使っています。

表示されている以下を非表示にする方法をお教えください。

1. 中央の「最近使用したファイルを開く・アドビオンラインサービス」
2. 右端の「PDFファイルを書き出し」

私には両方不要な表示で,特に2.はファイルの表示領域を狭める厄介ものです。

Aベストアンサー

こんにちは

(1)はAdobe Reader X(10)からデフォルト表示されるように
なっていて非表示にできないと思われます。

(2)は、ツール/署名/注釈(XIの場合)のプルダウンメニュー
なので、再度そのコマンド(恐らくはツール)を指定すれば
メニューが閉じると思います。

Adobe Readerにこぢわらないのであれば他のPDFビューワー
を使うというのもあるかもしれません。

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

QX-Window上で英語キーボードと認識されてしまう(VMware環境)

VMware Server上でx86 Solaris 10 11/06 をインストールしていますが、
X-Window上からのキーボード入力が英語キーボードと認識されてしまい、困っています。
使用しているのは日本語キーボードなのですが、例えばShift+2と押すと@が入力されます。

telnetでログインした場合は日本語キーボード通りの入力が出来るのですが
VMware Server Consoleを使ってCDEから入力した場合は
英語キーボードと認識されているようです。

kdmconfigでは キーボードは Japanese-106/type7 を選択しています。
CDEから呼び出したコンソール画面でdumpkeysを打つと、明らかに日本語キーボードの
キーバインド結果が表示されます。
また、/boot/solaris/bootenv.rcには
setprop kbd-type 'Japanese-106/type7' と記述しています。
しかしそれでもX上では英語キーボードの入力になってしまいます。

何がいけないのでしょうか?
わかる方、よろしくお願いします。

VMware Server上でx86 Solaris 10 11/06 をインストールしていますが、
X-Window上からのキーボード入力が英語キーボードと認識されてしまい、困っています。
使用しているのは日本語キーボードなのですが、例えばShift+2と押すと@が入力されます。

telnetでログインした場合は日本語キーボード通りの入力が出来るのですが
VMware Server Consoleを使ってCDEから入力した場合は
英語キーボードと認識されているようです。

kdmconfigでは キーボードは Japanese-106/type7 を選択しています。
CDEか...続きを読む

Aベストアンサー

VMwareは使ったことがないので、確実かはわかりませんが

# eeprom kbd-type=Japanese\(106\)

を試してみて下さい。

QC++ : cout << (数字) で実行時エラーが発生する理由

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}



---------------------------------------------------------


エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。

このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。

この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。
コード全体はこの下に掲載します。

cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。




全コード
------------------------------------------------------
#include <iostream>
#include <cstring>
using namespace std;

void rev_str(char *a);
void rev_str(const char *source, char *des);

int main()
{
char a[80], b[80];
strcpy(a, "hello, world!");
rev_str(a, b);
rev_str(a);
cout << a << "\n";
cout << b << "\n";

return 0;
}

void rev_str(char *a)
{
int length = 0;

cout << length;

while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}

void rev_str(const char *source, char *des)
{
char *a = (char*)malloc(sizeof(source));
strcpy(a, source);
rev_str(a);
strcpy(des, a);
free(a);
}

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for...続きを読む

Aベストアンサー

> void rev_str(const char *source, char *des)
> {
>  char *a = (char*)malloc(sizeof(source));
>  strcpy(a, source);
>  rev_str(a);
>  strcpy(des, a);
>  free(a);
> }
の中でmallocで確保されるサイズは sizeof(source)なので
char型のポインタサイズ ... 32Bit環境なら4バイトってことになります
その領域に対して strcpyを実行するので4バイト以上の文字列をコピーすればメモリー領域が破壊されます

NULL終端の文字列が対象なら
char *a = (char*)malloc( strlen( source ) );
といった具合に変更してみましょう


人気Q&Aランキング

おすすめ情報