簡體   English   中英

短C代碼:困惑的strlen()函數

[英]Short C Code: Confused strlen() function

我的編譯器:Dev C ++ 5.3.0.3 TDM-GCC 4.6.1 64位我的操作系統: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?!!!)感謝您的幫助!

strlen返回無符號值,並且對無符號整數執行比較i < strlen(text) - 1 ,其中0確實不大於另一個。

處理無符號類型時,如果僅使用+ ,則更容易推理:

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

甚至更好:

if (i < strlen(text))

理解內置類型和運算符的算術促銷和轉換可能有點棘手,可能值得閱讀。 當然有一些意想不到的情況。 當您comparing signed with unsigned types時,可以使用一個好的編譯器來警告您。

(如果你很好奇為什么在帶有有符號和無符號類型的表達式中都會被提升為無符號,你可能會注意到從有符號到無符號的轉換是絕對定義的(通過模運算),而從unsigned到signed的轉換是實現定義。我認為這意味着促銷規則意味着算術運算和比較的行為是明確定義的,而不僅僅是實現定義的。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM