【初心者歓迎】C/C++室 Ver.28【環境依存OK】
>>950 実行した限りでは、a , (b ? (c , d) : e) , f だな。
これはごく普通の挙動だ。
= だとなぜ C と C++ で変わるんだろうか?
ああ、俺のコンパイラは gcc/g++ 3.4.4 ね。
953 :
944:2006/07/04(火) 19:25:41
>>950 ああ、ごめん。
自分が試したコンパイラ=正しい、VC6=間違いと思い込んでしまっていた。
ところで規格をあたってみたら、たしかにCとC++ではその定義が異なっている。
X3010ではこう。(PDF P69-70)
6.5.15 条件演算子
条件式:
論理OR式
論理OR式 ? 式 : 条件式
ところがX3014ではこうなっている。(PDF P73-74)
5.16 二択条件演算子
二択条件式:
論理和式
論理和式 ? 式 : 代入式
X3014の付随書C(Cとの非互換の機能の説明がある)にも何も書かれていない。
コーディング規約で「三項演算子の使用禁止」と書く奴の気持ちが
初めてわかった気がした。
つ結合規則
>>954 三項演算子の右項で普通代入式なんか書かねーよw
>>953 なるほど。
C++ だと ? : の仕様として、
最右項に代入式があったら括弧なくても通るようになってんのか。
こんな仕様変更、始めて知ったな。
C/C++の違いじゃなくて、三項演算、代入は右からの
結合なので、括弧なしで結合するのが正しい構文解析だと思うのだが、
# ちなみにカンマは左からの結合
Cって、左辺値に三項演算式書けるんだっけ?
>>959 VC7でやってみた。
コンパイルは通るが、実質的にno effect。
int main(void)
int x=10, y=20, z;
char tmp[100];fgets(tmp,sizeof(tmp),stdin);z=atoi(tmp);
z&1?x:y = 0; //←no effect?
printf("x=%d,y=%d,z=%d\n",x,y,z);
return 0;
}
当然の事ながら、こうしたら期待した結果を得られた。
*(&(z&1?x:y)) = 0;
>>960 それだと第3項が代入になるんじゃない?
>>960 括弧足りないし
(z&1?x:y) = 0 がやりたいことじゃないの
>>959 出来ない。
>>953はC++で可能になったことが追加されているわけでしょ。
だから非互換ではない。あくまで追加。
cppでコンパイルしてたorz
>>826 機能からこれが気になってしょうがない。
ネタじゃなかったらC++を窓から放り投げるぞ。
コンパイラだけは使うけど…
>964
>847
開発の動機というか経緯が全然事実に即して書かれてない。
ガセであることがすぐわかってつまらない。
んで、ガセかどうかはともかく、質疑応答の内容そのものは間違ったこといってないのか?
例えば開発期間が長くなるとかetc
なる
というか、お前らものすごく遅れてますよと。
前世紀のネタで今更盛り上がられてもなぁ。
>>958 結合規則は優先順位が同じもの同士じゃないと意味がないのでは・・・。
972 :
デフォルトの名無しさん:2006/07/05(水) 19:51:21
UNIX系のg++で、pthreadを使って何かのイベントが発生したら処理をするような
機構を実現したいのですがどうしたらいいのでしょうか?
やはりwhileで変数を見張り続けるしかないのでしょうか?
わかりづらい質問ですが、どなたかわかる方がいらっしゃったら教えていただけ
ないでしょうか?
>>967 > 開発期間が長くなる
教科書的な回答をするとしたら、
「それはC++に熟練していない人間が関わるからだ。」
もう pthread なんて忘れたけど、
pthread_wait とかあった気がする。
977 :
デフォルトの名無しさん:2006/07/05(水) 21:51:15
phread_cond_wait(pthread_self(), &mutex)
として、自スレッドを一時停止させようとしているのですが、うまくいかないのです。
何か根本的に間違っている気がするのですが、、pthreadの資料少なすぎ orz
勘違いしていた、申し訳ない。
手元のK&Rのapendixに乗ってるBNRをまじめに追いかけてみたら、
確かにCでは第3項は代入式としては解釈されない、、、
# 手元に最新の規格ないので古い資料ですが、、、(ANSI1989版相当)
>>953の言っているように、生成規則自体が変わっているのだね…
そもそも、結合則に関して勘違いした状態で
知ったような口をたたいて申し訳なかった。
>>978 ×BNR
○BNF
、、、、、旅に出ます、、、、
981 :
デフォルトの名無しさん:2006/07/06(木) 10:05:00
>>980 ありがとうございます。
う〜ん、しかしやっぱりスレッド一時停止してくれません orz
pthreadのmanでも見るしかないのか。。。
何故マニュアルを読まん?
ARM5.16
(953のX3010と同じ)
第二のオペランドと第三のオペランドが、同じ型であり、
どちらも左辺値である場合、式の結果も左辺値である。
例をあげる。
int a,b;
x?a:b = 1; // ok
ARM19.1
conditional-expressionとassignment-expressionの構文は、
(throw-expressionを許すために)、以下のように変更された。
(略 953のX3014と同じ)
例をあげる。
i ? x=y : x=z; // i ? (x=y) : (x=z) を意味する
984 :
937:2006/07/06(木) 17:00:35
>>983 ARMですか…。もう読んだの10年以近く前でした。
D&Eの横に置いてあったんだけど目に入ってなかったです。
皆さんの書き込みで大体納得できました。
直感に従うように変更された、という感じですね。
はぁ
x = i ? y : z; でいいやん
俺のチンコデッドロックで固まっちゃった
どうしよう
>>987 おいしいもの食ってうんこすればなおるよ!
ハ_ハ
('(゚∀゚∩ なおらなかったよ!
ヽ 〈
ヽヽ_)
getch()について質問があります
#include <stdio.h>
#include <curses.h>
int main(void)
{
printf("Enter a letter: ");
printf("That letter is %c.\n",getch());
return(0);
}
というプログラムなんですがコンパイルして実行してもgetch()の部分がすっ飛ばされて終了してしまいます
Linux環境でgetch()をどうしても使わなくてはいけないのですが何か解決法はないでしょうか?
992 :
デフォルトの名無しさん:2006/07/08(土) 22:48:25
次スレムリだったor2
つか、これUnix Programming FAQに載るほどの超既出問題なんですが。
996
長門
998
999 :
デフォルトの名無しさん:2006/07/09(日) 00:01:28
999
↓m9(^Д^)プギャーッ
1000 :
デフォルトの名無しさん:2006/07/09(日) 00:01:57
1000
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。