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

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

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1765閲覧

【!--n】の意味をおしえてください (C言語)

haru11111

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/08/18 01:40

#include <stdio.h>

int mystrncmp(char *s,char *t,int n) {
while( *s == *t ) {
if ( *s == '\0' || !--n ) {
return 0;
}
*s++;
*t++;
}
return *s - *t;
}

int main (void) {
char str[] = "abc";
printf("%d\n",mystrncmp(str,"ab",3));
printf("%d\n",mystrncmp(str,"abc",3));
printf("%d\n",mystrncmp(str,"abced",3));
printf("%d\n",mystrncmp(str,"abced",6));
return 0;
}

こちらのコード(strncmpの自作関数)の 3行目 【!--n】の意味をおしえてください。
n != n-1 ということでしょうか?これを含める理由がわかっていません。よろしくお願い致します。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/18 01:52

前置きと後置きの違いはご存じですか?
kazuma-s

2021/08/18 02:16 編集

ソースコードを「```C」の行と、「```」の行で挟んでください。 mystrncmp("abc", "", 0) が 0 になりません。 strncmp("abc", "", 0) は 0 です。
haru11111

2021/08/18 02:17

使う意味がよくわかりました!ありがとうございます。
kazuma-s

2021/08/18 02:47

「```C」と「```」で挟む意味が分かったのなら、質問を編集してください。
haru11111

2021/08/18 02:52

ソースコードを「```C」の行と、「```」の行で挟んでください。 ここの文章の意味は理解できていません
haru11111

2021/08/18 02:52

具体的には「```C」の行と、「```」の行 がどこを指すのかがわかりません
kazuma-s

2021/08/18 03:39

```C #include <stdio.h> ... } ``` ソースコードを「```C」の行と、「```」の行で挟んでください。 teratail の「質問をするときのヒント」をよく読んでください。
WoodenHamlet

2021/08/18 05:18

まあ直接の回答じゃないのでこっちに書きますが、tのヌル文字判定も入れた方が良いのでは?
jimbe

2021/08/18 07:17

> tのヌル文字判定 無くて大丈夫に見えますけど…。
guest

回答1

0

ベストアンサー

!(--n) です.

条件として言えば,「nをデクリメントした結果が0であること」.


この部分をもっと細かく書けばこうなります.

while( *s == *t ) { if ( *s == '\0' )return 0; --n; //nを1減らす if( n==0 )return 0; //nの値が0なら *s++; //ここの*は意味ないが *t++; //同上 }

投稿2021/08/18 01:42

編集2021/08/18 02:15
fana

総合スコア11708

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

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

fana

2021/08/18 01:50

「自作」だと言うなら自分で書いたものの意味を他者に訊かないだろうし, どこかから完品を持ってきたにしては「なんだかなぁ」というコードだし…??
fana

2021/08/18 02:02 編集

演算子が複数重なってて「何だこれ?」となった(なる可能性が懸念される)ような場合には こんな感じで括弧を付けて意味を明確にすれば良いでしょう.
haru11111

2021/08/18 02:07

ご回答ありがとうございます。「nをデクリメントした結果が0であること」ということは丁寧に書き直すと、n-1 == 0 ということでしょうか?
fana

2021/08/18 02:16 編集

それだと「nの値をデクリメントする」処理がなくなっちゃいますね. (単に,n==1 という意味になっちゃう.) !(--n) は, ・まず,変数nの値を1減らして ・次に,その値が0か否かを評価する という2つの仕事をしているので. 丁寧(?)に書き換えたらこうなる,というのを回答に追記してみました.
haru11111

2021/08/18 02:17

ようやく理解致しました。ご丁寧に説明して頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問