C言語なら俺に聞け 140 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 6f8c-8ulf)
垢版 |
2017/05/11(木) 22:20:03.99ID:cn414UR90
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


http://echo.2ch.net/test/read.cgi/tech/1487757355/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2017/05/12(金) 13:08:15.72ID://5I1UQ2M
イラネ
2017/05/12(金) 14:58:26.42ID:IiKpnLAId
C言語からVBAで作ったエクセルマクロって実行できないの?
4デフォルトの名無しさん (ワッチョイ cfa9-xHOS)
垢版 |
2017/05/12(金) 16:05:36.32ID:UWkhiPx90
C99からif,for,whileの後に続く括弧の中がブロックのなかという
認識になったらしいんですけど、for以外でどうやって
その中で変数を宣言できるというんですか?
だったらforだけブロックの中っていうことでいいんじゃないんですか?
5デフォルトの名無しさん (ワッチョイ c300-yCMP)
垢版 |
2017/05/12(金) 16:31:31.05ID:js7UY7om0
if ( char * p = malloc( N ) )
こういうのとか?
2017/05/12(金) 18:03:15.98ID:UWkhiPx90
それな
2017/05/12(金) 22:01:43.38ID:HEUwhpUy0
C言語でエクセルのVBAマクロの実行できないの?
2017/05/12(金) 22:06:16.73ID:r6F8dCD7d
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45361&;forum=7
2017/05/12(金) 22:08:09.17ID:HEUwhpUy0
C++かぁ
2017/05/12(金) 22:44:50.71ID:y9SJMwIK0
>>7
VBA マクロのインタプリター書けば良くね?Cで。
2017/05/12(金) 23:06:05.96ID:UkU1KlKv0
おいQZゴミコードをここで書くなよ
ウンコードに投稿しろよ
2017/05/12(金) 23:07:33.76ID:UkU1KlKv0
おいQZ
おまえってやればやるほど洗練された糞さを放ったコードが出来上がるから
自覚しとけ
2017/05/12(金) 23:09:00.10ID:UkU1KlKv0
おいQZいろんなC系スレでクソコードばらまくのやめろよ
今時Cでクソなコード書いてるのはおまえしかいない
2017/05/13(土) 12:44:34.80ID:vKP2EClq0
printf("%s", string);

ではなくて

printf(string);

でエラーが出ないようにするにはどうしたらいいですか?
2017/05/13(土) 13:06:30.63ID:7e4RDEpq0
#define printf(string) printf("%s", string)
とする
2017/05/13(土) 13:47:03.32ID:7pndE6Ym0
stringがchar*なら、それでエラーは出ない
キミが間違っとる
17デフォルトの名無しさん (ワッチョイ c300-yCMP)
垢版 |
2017/05/13(土) 14:03:34.24ID:u94khtn50
コンパイラーによってはセキュリティ警告でも出るんだろうな
2017/05/13(土) 14:12:40.14ID:m48zL+ZP0
>>16
print「f」なのにフォーマットしないってなんか気持ち悪いな
2017/05/13(土) 14:13:58.16ID:RjzTmCQE0
エラーがコンパイル時なのか実行時なのか
2017/05/13(土) 14:20:39.18ID:m48zL+ZP0
gcc使っているならコンパイル時のオプションに-wでコンパイルできたわ
2017/05/13(土) 14:51:14.61ID:7U8nUyJbM
>>18
printf("Hello, world!/n”);
気持ち悪いか?
2017/05/13(土) 14:58:27.01ID:Swj/Rgps0
>>21
馬鹿
2017/05/13(土) 15:42:18.61ID:zKUmpFvI0
string の中身に %s とか %d とかはいってると あわわわ
2017/05/13(土) 15:42:59.20ID:VT1sIlGJ0
ヌルポン渡すと落ちるぞ
2017/05/13(土) 15:55:06.50ID:1Sz8mIFNa
そもそも出ないだろw
2017/05/13(土) 22:21:45.16ID:IUtkDsju0
stringがワイド文字列なら警告くらい出るだろ
2017/05/13(土) 22:24:52.04ID:7pndE6Ym0
>>23
ああ、そう言う事なら、静的な引数チェクが不可能な文字列は警告だすのもありかも知れんな
実例は見た事ないが
2017/05/13(土) 23:37:01.87ID:Bvln+1PG0
format string attackって攻撃が実在するからな
C11で%nが廃止されたのも、それが原因だし
2017/05/14(日) 03:33:24.24ID:AUHwE8VO0
>>27
どのコンパイラもオプションつければ動的に決まる文字列は警告出すぞ
遅い上に危険で利点がない

%nが消えてもメモリ内を読まれるのは脆弱性
2017/05/14(日) 03:39:55.42ID:RBSPlVIO0
やりたいことって、putsではダメなのかな?
2017/05/14(日) 04:15:58.62ID:c1+aTdNX0
プッツ!
2017/05/14(日) 10:30:41.42ID:QnhMTTR+0
a+=1;

a++;
って同じ意味ですか?
2017/05/14(日) 10:51:06.70ID:44d8vf440
>>32
a+=1 と ++a の評価は同じ
a+=1 と a++ の評価は違う
評価後の値はどちらも同じ

#include <stdio.h>
int main(void)
{
int a;

a = 0;
printf("%d\n", a); // a=0
printf("%d\n", a += 1); // a=1 評価結果はインクリメント後の値
printf("%d\n\n", a); //a=1

a = 0;
printf("%d\n", a); // a=0
printf("%d\n", ++a); // a=1 評価結果はインクリメント後の値
printf("%d\n\n", a); // a=1

a = 0;
printf("%d\n", a); // a=0
printf("%d\n", a++); // a=0 評価結果はインクリメント前の値
printf("%d\n\n", a); // a=1

return 0;
}
34デフォルトの名無しさん (ワッチョイ 8ff3-SU9n)
垢版 |
2017/05/15(月) 10:50:08.41ID:ITGYMTaF0
int a=1;
a = a+++a;

これ、たいていの環境で 3 になるみたいだけど
内部ではどっちに構文解析されてるの?
2017/05/15(月) 11:49:32.39ID:8jcxUI920
>>34
a=b++ + c;
2017/05/15(月) 11:56:31.63ID:Z3hdp57V0
>>34
後置インクリメント演算子(a++)は+演算子や前置インクリメント演算子(++a)より優先順位高い
2017/05/15(月) 12:12:51.85ID:Vosr5hkL0
>>34
VC++の場合
a = (a + a)++;

GCCの場合
a = ++(a + a);

int a = 10;
printf("%d\n", a); // a=10
printf("%d\n", a=a+++a); // a=20 (VC++の場合)、a=21 (GCCの場合)
printf("%d\n\n", a); // a=21
2017/05/15(月) 12:55:00.64ID:FMK+ZQcW0
右辺値のインクリメントが出鱈目過ぎる
2017/05/15(月) 13:04:41.31ID:m4iBjxKl0
>>36
演算子の優先順位と構文解析は関係ねーよ

前方から最長になるように字句解釈するから、 a=a+++aは、a = a ++ + aになる
2017/05/15(月) 13:26:43.15ID:Z3hdp57V0
>>39
えっ? 関係ないの?
41デフォルトの名無しさん (ワッチョイ 7fcd-/tbB)
垢版 |
2017/05/15(月) 14:05:11.81ID:KBSLJwGw0
>>37
// GCCの場合
a=10;
printf("1: %d\n", a = a++ + a); // a=21
a=10;
printf("2: %d\n", a = ++a + a); // a=22
a=10;
printf("3: %d\n", a = a + a++); // a=21
a=10;
printf("4: %d\n", a = a + ++a); // a=22

1と2は予想通りだけど3と4は予想が外れた。
GCCは素直に前方から評価すると思っていたが、
インクリメント演算がある項を先に評価するようだ。
2017/05/15(月) 14:08:51.26ID:ITGYMTaF0
>>39
なるほど先頭から最長一致か ありがとう

a = a+++a; // 21
a = a+ ++a; // 22
a = a++ +a; // 21

gccだとこんな感じになったわ
2017/05/15(月) 14:28:56.88ID:m4iBjxKl0
>>40
関係ない

演算子の優先順位はトークンが確定した後の話
構文解釈とは一切関係ない
2017/05/15(月) 14:50:03.73ID:k1YI7zCW0
知ったかぶりしないで
副作用完了点を検索してからレスしようね
2017/05/15(月) 15:08:26.82ID:m4iBjxKl0
さすがに、a=a+++a が未定義なことぐらいわかってるだろ
そのうえで、どう動作してるのだろうかって話じゃねーの?
2017/05/15(月) 15:17:45.01ID:ugjsGD9A0
どう字句解析されるのかって話だろ
2017/05/15(月) 15:41:11.64ID:+h60b5kha
初めから()で囲んで優先つけた方がいいね
2017/05/15(月) 15:48:46.87ID:Vosr5hkL0
VC++での逆アセンブルコード (Visual Studio 2017 debugモード)

// a=a++
a = 10;
004037DE mov dword ptr [a],0Ah
a = a++;
004037E5 mov eax,dword ptr [a]
004037E8 mov dword ptr [a],eax
004037EB mov ecx,dword ptr [a]
004037EE add ecx,1
004037F1 mov dword ptr [a],ecx

// a=++a
a = 10;
004037F4 mov dword ptr [a],0Ah
a = ++a;
004037FB mov eax,dword ptr [a]
004037FE add eax,1
00403801 mov dword ptr [a],eax
00403804 mov ecx,dword ptr [a]
00403807 mov dword ptr [a],ecx

// a = a+++a
a = 10;
0040380A mov dword ptr [a],0Ah
a = a+++a;
00403811 mov eax,dword ptr [a] // aの値と
00403814 add eax,dword ptr [a] // aの値を加算して (a+a)
00403817 mov dword ptr [a],eax // 一時保存(評価)して
0040381A mov ecx,dword ptr [a] // 評価結果に対して
0040381D add ecx,1       // 1を加算して (a+a)++
00403820 mov dword ptr [a],ecx // 最終結果をaに代入
2017/05/15(月) 16:01:51.35ID:Vosr5hkL0
GCCは逆コンパイラが使える環境を持っていないので誰か頼みます
2017/05/15(月) 16:17:06.14ID:vCh6HJnv0
-S付けるとアセンブラソース出力してくれるよ
2017/05/15(月) 16:17:38.49ID:k1YI7zCW0
>>45
未定義とされているものの実装を調べる意味は一片たりとも無い
b = a+++a; ならば文法どおりに解釈されてなければ、コンパイラのバグなので検証する意味はある
52デフォルトの名無しさん (ワッチョイ 2375-QWrk)
垢版 |
2017/05/15(月) 16:26:58.46ID:K4VlRHcT0
>>49
https://godbolt.org
53デフォルトの名無しさん (ワッチョイ 2375-QWrk)
垢版 |
2017/05/15(月) 16:38:44.35ID:K4VlRHcT0
>>51
a+++a;は未定義動作でしょ?
2017/05/15(月) 16:55:22.96ID:m4iBjxKl0
>>53
そこだけで未定義
2つ目のaを別の変数に退避し上で加算しないとアウト
2017/05/15(月) 17:14:07.00ID:Vosr5hkL0
>>52を利用して逆アセンブルコードを調べてみた
スタックを使って細工するところとかコードの展開内容としては結構トリッキーだけど
GCCの場合のa=a+++a のイメージとしては
{
tmp = a, a=(++a) + tmp;
}
といった感じかな
>>54の言う通り内部的には別変数を利用しているとも言える

逆アセンブルコード
push rbp     
mov rdp, rsp
a = 10;
mov DWORD PTR [rbp-4], 10

a = a+++a;
mov eax, DWORD PTR [rbp-4] // aの値に

lea edx, [rax+1]
 // 1を加算して
mov DWORD PTR [rbp-4], edx // aに保存

add DWORD PTR [rbp-4], eax // aに元のaの値を加算
pop rbp
2017/05/15(月) 17:17:38.16ID:Vosr5hkL0
レイアウト崩れたので修正

逆アセンブルコード
 push rbp     
 mov rdp, rsp
a = 10;
 mov DWORD PTR [rbp-4], 10
a = a+++a;
 mov eax, DWORD PTR [rbp-4] // aの値に
 lea edx, [rax+1] // 1を加算して
 mov DWORD PTR [rbp-4], edx // aに保存
 add DWORD PTR [rbp-4], eax // aに元のaの値を加算
 pop rbp
2017/05/15(月) 17:33:28.21ID:FMK+ZQcW0
無能な働き者
2017/05/15(月) 18:48:03.94ID:k1YI7zCW0
>>53
ああすまん、そのとおりだね
なに寝ぼけてたんだろう
2017/05/15(月) 20:47:42.32ID:l6TF2MzAM
>>33
ありがとうございます!
すっきりしました!
2017/05/15(月) 21:40:37.62ID:ITGYMTaF0
>>53
b = a++ +a ならギリギリセーフかなーと思ってた。
これもアウトなんか
2017/05/15(月) 22:35:38.71ID:m4iBjxKl0
ざっくりだけど
C99以前だとaの変更とその変更と関係ないaの評価を行っているからアウト
C11だとa++でのaへの1加算と、2つ目のaの評価に順序性がないからアウト
2017/05/15(月) 22:43:52.12ID:KR9fXitY0
おいQZお前はC向いてないからやめろ
このスレを荒らすなクソマニア
2017/05/16(火) 02:46:28.46ID:8VX1hNny0
a = f(x) + g(x);
とした場合、f(x)とg(x)の関数呼び出しで
どちらが先になるのかは未定義ってこと?
2017/05/16(火) 03:27:48.17ID:lv7gi33v0
>>63
関数呼び出しの順序の問題ではなくて、インクリメント演算子を自分自身に適用した場合の副作用の問題
f(x)の副作用としてg(x)の状態を変化させ、g(x)の副作用としてf(x)の状態を変化させるような場合、(f(x) + g(x))の評価は未定義ということ
2017/05/16(火) 03:34:54.85ID:lv7gi33v0
「インクリメント演算子を自分自身に適用した場合」は説明不足だった
「同じ式の中でインクリメント演算子を自分自身に繰り返し適用した場合」の方が適切だった
2017/05/16(火) 04:11:10.64ID:8VX1hNny0
回答ありがとう
2017/05/16(火) 12:24:07.64ID:hxKx6VJm0
C言語でVBA
2017/05/16(火) 14:51:29.95ID:uP7i9rQE0
>>63
a++ + a
右のaがどうなるか考えてみ
2017/05/16(火) 18:02:14.83ID:9umlqZ68M
a=a+++++aはエラーなの?
70デフォルトの名無しさん (ワッチョイ 8383-hEfH)
垢版 |
2017/05/16(火) 18:26:04.60ID:j2WgBIQo0
大学の講義でc言語やってるのですが、行き詰まってしまったので質問させていただきます
分割コンパイルしているのですが、全部書いてあります
コメント文で分割コンパイルの区切りを表しています
http://codepad.org/VplJG9tZ
これによって表示されるものを左に90度回転させたいのですが条件としてmain関数しかいじってはいけないというものがあります
2次元配列でいけるのかと思ったのですが、どうしたらいいかわからず手詰まりです
よろしくお願いします
2017/05/16(火) 18:28:00.76ID:7Qb0OzW/0
宿題スレにいけ
2017/05/16(火) 19:46:46.04ID:GFMW00ds0
a = a----a;
ってコンパイルできないのね
a = a-- - -a;
にすればコンパイルはできるが
2017/05/16(火) 20:26:25.96ID:fevd2QwgM
>>69
エラーになるかどうかもわからない
それが未定義動作
2017/05/16(火) 20:48:15.67ID:8VX1hNny0
>>64 >>68
レスもらっておいて何ですが、やっぱりなんか引っ掛かってたので自分でも調べてみました

http://www.soum.co.jp/misc/tom/programmer/4.html#id9
https://mattn.kaoriya.net/software/lang/c/20130426110223.htm

あたりを読んで理解した気になりました
C言語テラコワス
75デフォルトの名無しさん (ワッチョイ 8383-hEfH)
垢版 |
2017/05/16(火) 21:05:08.54ID:j2WgBIQo0
>>71
すみません宿題スレとはどこでしょうか
2017/05/16(火) 21:41:19.00ID:9umlqZ68M
>>74
問題はグローバル変数を使うからじゃないの?
77デフォルトの名無しさん (ペラペラ SD9f-5YWk)
垢版 |
2017/05/16(火) 22:17:40.57ID:Ag35s8j3D
>>68
swiftだとa++は廃止された
分かりやすく書くってこと
2017/05/16(火) 22:33:27.46ID:Slyc8zwMd
http://d.hatena.ne.jp/THE_MIND/touch/20090205/1233845661
これ真似たけどExcel開かない
2017/05/16(火) 22:33:48.78ID:Slyc8zwMd
あ、間違えましたすみません
2017/05/16(火) 23:02:13.38ID:OtKe4ieo0
わからなかったの間違えだろ
正直に言えよ無職無能QZ
2017/05/16(火) 23:06:19.27ID:OtKe4ieo0
QZ怒りの他スレ進出ww
2017/05/16(火) 23:07:01.08ID:OtKe4ieo0
宿題スレはどこでしょうかw
おいQZこのスレまで宿題スレ化しようと企んでるのかよ
2017/05/16(火) 23:09:40.58ID:OtKe4ieo0
最近の宿題スレで質問者演じてるやつと口調が見事に一致
84デフォルトの名無しさん (ワッチョイ c300-yCMP)
垢版 |
2017/05/16(火) 23:17:13.00ID:f+nf4d790
インクリメントが無い言語はクソ
2017/05/16(火) 23:18:04.22ID:OtKe4ieo0
QZ怒りの負け惜しみ発言開始
2017/05/16(火) 23:25:44.32ID:OtKe4ieo0
QZ怒りのC絶賛
2017/05/16(火) 23:56:41.57ID:hxKx6VJm0
QZってなに
2017/05/17(水) 00:12:22.70ID:trROhyaD0
QZ怒りの自己紹介
2017/05/17(水) 00:16:07.98ID:t3IXdrQL0
C言語って、機械に分かりやすい言語なんじゃないかな
2017/05/17(水) 00:34:30.07ID:Y+yL8XVsM
何をいまさら
2017/05/17(水) 06:54:51.29ID:wJf0VzTx0
>>87
エディタじゃね?
2017/05/17(水) 11:14:31.02ID:trROhyaD0
QZ怒りのエディタ自慢
93デフォルトの名無しさん (ガックシ 067f-sbka)
垢版 |
2017/05/17(水) 16:12:39.52ID:IVbqBIIG6
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void main()
{
int i, j, a; //int 整数
FILE *fout; //FILE ファイルの管理用
errno_t error;
if ((error = fopen_s(&fout, "output.txt", "w")) != 0){
printf(" エラー:ファイルの出力ができませんa \n");
exit(1);
}
a = 0;
for (i = 0; i<5; i++){
for (j = 0; j<10; j++){
a = a + 1;
fprintf_s(fout, "%d ", a);
}
fprintf_s(fout, "\n");
}
fclose(fout);
}
これにIf文使って
0 0 0 0 0 0 0 0 0 0
0 0 0 14 15 16 17 0 0 0
0 0 0 24 25 26 27 0 0 0
0 0 0 34 35 36 37 0 0 0
0 0 0 0 0 0 0 0 0 0
にするにはどうすればいいの?おしえてエロい人
2017/05/17(水) 16:18:48.87ID:bdvqA1ry0
>>93
なかなか良い問題だな。大学生?
2017/05/17(水) 16:23:04.39ID:se1pH3p/0
a = a + 1;
if (1 <= i && i <= 3 && 3 <= j && j <= 6) fprintf_s(fout, "%d ", a);
else fprintf_s(fout, "0 ");
96デフォルトの名無しさん (ガックシ 067f-sbka)
垢版 |
2017/05/17(水) 16:24:58.51ID:IVbqBIIG6
>>94
大学生です。
指定場所以外も数字が出てしまいます
2017/05/17(水) 16:32:34.86ID:t3IXdrQL0
if (4 <= (a % 10) && (a % 10) <= 7) printf("%d ", a);
else printf("%d ", 0);
2017/05/17(水) 16:35:45.80ID:smeqz8ba0
>>93
エロい人への質問は板違い
http://phoebe.bbspink.com/hneta/
へ移動しなさい
99デフォルトの名無しさん (ガックシ 067f-sbka)
垢版 |
2017/05/17(水) 16:45:05.44ID:IVbqBIIG6
>>95
ベン図的な考え方ですか......!!
ありがとうございます。
>>97
なぜか0〜50全て表示されてしまってます!
>>98
エロ魔人になるにはまだ早いです!
2017/05/17(水) 16:47:44.21ID:smeqz8ba0
>>99
キミがなるんじゃ無い
キミが質問したがってるエロい人の住処に移れと言っている
2017/05/17(水) 18:12:03.01ID:sXGKWmUcM
>>93
どうでもいいけどコメント酷すぎ
> int i, j, a; //int 整数
> FILE *fout; //FILE ファイルの管理用
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況