【初心者歓迎】C/C++室 Ver.28【環境依存OK】

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2006/07/04(火) 19:23:00
>>950
実行した限りでは、a , (b ? (c , d) : e) , f だな。
これはごく普通の挙動だ。
= だとなぜ C と C++ で変わるんだろうか?

ああ、俺のコンパイラは gcc/g++ 3.4.4 ね。
953944: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デフォルトの名無しさん:2006/07/04(火) 20:02:25
コーディング規約で「三項演算子の使用禁止」と書く奴の気持ちが
初めてわかった気がした。
955デフォルトの名無しさん:2006/07/04(火) 21:03:54
つ結合規則
956デフォルトの名無しさん:2006/07/05(水) 02:45:45
>>954
三項演算子の右項で普通代入式なんか書かねーよw
957デフォルトの名無しさん:2006/07/05(水) 02:48:22
>>953
なるほど。
C++ だと ? : の仕様として、
最右項に代入式があったら括弧なくても通るようになってんのか。
こんな仕様変更、始めて知ったな。
958デフォルトの名無しさん:2006/07/05(水) 10:41:32
C/C++の違いじゃなくて、三項演算、代入は右からの
結合なので、括弧なしで結合するのが正しい構文解析だと思うのだが、
# ちなみにカンマは左からの結合
959デフォルトの名無しさん:2006/07/05(水) 11:15:27
Cって、左辺値に三項演算式書けるんだっけ?
960デフォルトの名無しさん:2006/07/05(水) 12:06:31 BE:104814869-#
>>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;
961デフォルトの名無しさん:2006/07/05(水) 14:09:48
>>960
それだと第3項が代入になるんじゃない?
962デフォルトの名無しさん:2006/07/05(水) 14:12:43
>>960
括弧足りないし
(z&1?x:y) = 0 がやりたいことじゃないの

>>959
出来ない。
>>953はC++で可能になったことが追加されているわけでしょ。
だから非互換ではない。あくまで追加。
963デフォルトの名無しさん:2006/07/05(水) 14:27:05 BE:46584364-#
cppでコンパイルしてたorz
964デフォルトの名無しさん:2006/07/05(水) 15:38:38
>>826
機能からこれが気になってしょうがない。
ネタじゃなかったらC++を窓から放り投げるぞ。
コンパイラだけは使うけど…
965デフォルトの名無しさん:2006/07/05(水) 15:53:55
>964
>847
966デフォルトの名無しさん:2006/07/05(水) 16:01:19
開発の動機というか経緯が全然事実に即して書かれてない。
ガセであることがすぐわかってつまらない。
967デフォルトの名無しさん:2006/07/05(水) 16:08:07
んで、ガセかどうかはともかく、質疑応答の内容そのものは間違ったこといってないのか?
例えば開発期間が長くなるとかetc
968デフォルトの名無しさん:2006/07/05(水) 16:10:32
なる
969デフォルトの名無しさん:2006/07/05(水) 16:13:04
というか、お前らものすごく遅れてますよと。
970デフォルトの名無しさん:2006/07/05(水) 16:39:45 BE:77640858-#
前世紀のネタで今更盛り上がられてもなぁ。
971デフォルトの名無しさん:2006/07/05(水) 17:12:42
>>958
結合規則は優先順位が同じもの同士じゃないと意味がないのでは・・・。
972デフォルトの名無しさん:2006/07/05(水) 19:51:21
UNIX系のg++で、pthreadを使って何かのイベントが発生したら処理をするような
機構を実現したいのですがどうしたらいいのでしょうか?
やはりwhileで変数を見張り続けるしかないのでしょうか?

わかりづらい質問ですが、どなたかわかる方がいらっしゃったら教えていただけ
ないでしょうか?
973デフォルトの名無しさん:2006/07/05(水) 20:11:54
>>967
> 開発期間が長くなる
教科書的な回答をするとしたら、
「それはC++に熟練していない人間が関わるからだ。」
974デフォルトの名無しさん:2006/07/05(水) 20:38:19
もう pthread なんて忘れたけど、
pthread_wait とかあった気がする。
975デフォルトの名無しさん:2006/07/05(水) 20:42:14
>>972
シグナルでも送れば?
976デフォルトの名無しさん:2006/07/05(水) 21:12:19
>>971
なこたない。
977デフォルトの名無しさん:2006/07/05(水) 21:51:15
phread_cond_wait(pthread_self(), &mutex)
として、自スレッドを一時停止させようとしているのですが、うまくいかないのです。
何か根本的に間違っている気がするのですが、、pthreadの資料少なすぎ orz
978955, 958, 976:2006/07/05(水) 21:57:10
勘違いしていた、申し訳ない。

手元のK&Rのapendixに乗ってるBNRをまじめに追いかけてみたら、
確かにCでは第3項は代入式としては解釈されない、、、
# 手元に最新の規格ないので古い資料ですが、、、(ANSI1989版相当)
>>953の言っているように、生成規則自体が変わっているのだね…

そもそも、結合則に関して勘違いした状態で
知ったような口をたたいて申し訳なかった。
979デフォルトの名無しさん:2006/07/05(水) 22:07:16
>>978
×BNR
○BNF

、、、、、旅に出ます、、、、
980デフォルトの名無しさん:2006/07/05(水) 22:56:42
>977
cond_waitするんだから、第一引数は当然condition objectを渡さないとイケナイ。
http://www.mtl.t.u-tokyo.ac.jp/~nminoru/pc/event.txt
ここらをみるといいかもしれんし、manする方が早いかもしれない。
981デフォルトの名無しさん:2006/07/06(木) 10:05:00
>>980
ありがとうございます。
う〜ん、しかしやっぱりスレッド一時停止してくれません orz

pthreadのmanでも見るしかないのか。。。
982デフォルトの名無しさん:2006/07/06(木) 10:09:44
何故マニュアルを読まん?
983デフォルトの名無しさん:2006/07/06(木) 11:48:45
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) を意味する
984937:2006/07/06(木) 17:00:35
>>983
ARMですか…。もう読んだの10年以近く前でした。

D&Eの横に置いてあったんだけど目に入ってなかったです。
皆さんの書き込みで大体納得できました。

直感に従うように変更された、という感じですね。
985デフォルトの名無しさん:2006/07/07(金) 01:14:43
はぁ
986デフォルトの名無しさん:2006/07/07(金) 23:13:26
x = i ? y : z; でいいやん
987デフォルトの名無しさん:2006/07/07(金) 23:36:37
俺のチンコデッドロックで固まっちゃった
どうしよう
988デフォルトの名無しさん:2006/07/08(土) 00:11:11
>>987
おいしいもの食ってうんこすればなおるよ!
989デフォルトの名無しさん:2006/07/08(土) 19:00:57
                     
                 ハ_ハ  
               ('(゚∀゚∩ なおらなかったよ!
                ヽ  〈 
                 ヽヽ_)
990デフォルトの名無しさん:2006/07/08(土) 19:50:26
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()をどうしても使わなくてはいけないのですが何か解決法はないでしょうか?
991デフォルトの名無しさん:2006/07/08(土) 20:03:13
>990
curses使いたいならちゃんと手順を踏んで使おう

適当にぐぐった使用例:
ttp://www.h7.dion.ne.jp/~matsu/feature/c-language/index.html#feature.c-language.curses
992デフォルトの名無しさん:2006/07/08(土) 22:48:25
次スレムリだったor2
993デフォルトの名無しさん:2006/07/08(土) 22:53:56
>>990
Cursesきつそうなら↓を参考に。
http://search.luky.org/fol.2002/msg00636.html
http://www.slayers.nu/~kumasaka/Gyoumu/kbdhit.html

UNIXプログラミングスレの方が適当だろうね。
ANSI Cにはない機能だから。
994デフォルトの名無しさん:2006/07/08(土) 22:59:31
つか、これUnix Programming FAQに載るほどの超既出問題なんですが。
995デフォルトの名無しさん:2006/07/08(土) 23:05:45
次スレ
【初心者歓迎】C/C++室 Ver.29【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1152367512/
996デフォルトの名無しさん:2006/07/08(土) 23:12:47
996
997デフォルトの名無しさん:2006/07/08(土) 23:46:39
長門
998デフォルトの名無しさん:2006/07/09(日) 00:00:43
998
999デフォルトの名無しさん:2006/07/09(日) 00:01:28
999


↓m9(^Д^)プギャーッ
1000デフォルトの名無しさん:2006/07/09(日) 00:01:57
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。