2

私のコンパイラ: Dev C++ 5.3.0.3 TDM-GCC 4.6.1 64 ビット 私の OS: Windows 7、64 ビット

私のCコード:

# include "stdio.h"
# include "string.h"

# define MAX (501)

int main() {
    char
        text[MAX]="";

    int i;

    i=0;
    printf("%d\n",strlen(text));        /* 0 */
    printf("%d\n",(strlen(text)-1));    /* -1 */
    if ( i<= (strlen(text)-1) ) printf("haha"); /* haha */

    return 0;
}

私の質問:なぜ「はは」が印刷されているのですか?! ( 0>-1 ?!!!) ご協力ありがとうございます!

4

1 に答える 1

10

strlen符号なしの値を返し、比較i < strlen(text) - 1符号なしの整数に対して実行されます0。実際には、他の値よりも大きくありません。

署名されていない型を扱う場合、 のみを使用すると、推論がはるかに簡単になります+

if (i + 1 <= strlen(text))

またはさらに良い:

if (i < strlen(text))

組み込みの型と演算子の算術昇格と変換を理解するのは少し難しいかもしれませんが、それらについて読む価値があるかもしれません。確かに想定外の事態はあります。良いコンパイラは、あなたがcomparing signed with unsigned types.

(符号付きと符号なしの両方の型を持つ式が符号なしに昇格される理由に興味がある場合は、符号付きから符号なしへの変換が (剰余算術を介して) 完全に明確に定義されていることに気付くかもしれませんが、符号なしから符号付きへの変換はこれは、プロモーション ルールが、算術演算と比較の動作が実装定義だけでなく、明確に定義されていることを意味していることを意味していると思います。)

于 2013-02-03T16:55:54.420 に答える