我嘗試將 strlen(string) 與 -1 進行比較,但不同的方法給出了不同的結果:
char string[] = {"1234"};
int len = strlen(string);
int bool;
bool = -1 < strlen(string);
printf("%d",bool); //bool=0
bool = -1 < len;
printf("%d",bool); //bool=1
將值分配給 len 然后比較它們會給出正確的結果,但我不明白為什么直接與 strlen 比較不起作用。
uj5u.com熱心網友回復:
該函式strlen具有無符號回傳型別size_t
size_t strlen(const char *s);
通常 typesize_t是 type 的別名unsigned long。
無論如何,無符號型別size_t的等級不小于有符號型別的等級int。因此,由于通常的算術轉換,有符號型別的運算元int被轉換為型別size_t,如果該型別的運算元int具有負值而不是由于傳播符號位,它變成一個大的無符號值。
所以在這個運算式中
-1 < strlen(string)
的型別size_t(運算式的常用型別)轉換為型別后的左運算元size_t變得大于右運算元。
考慮以下演示程式。
#include <stdio.h>
int main( void )
{
printf( "-1 = %d\n", -1 );
printf( "( size_t )-1 = %zu\n", ( size_t )-1 );
return 0;
}
它的輸出可能看起來像
-1 = -1
( size_t )-1 = 4294967295
uj5u.com熱心網友回復:
我猜是符號問題,與strlen必須將 -1 轉換為無符號相比,因此所有位都設定為 1,因此無論與哪個值進行比較,運算式的計算結果都為 0。
在與型別變數進行比較時,不會出現問題,因為編譯器不必猜測必須將哪個運算元強制轉換為其他型別。
如果你用 編譯會發生什么-Wall -Wextra -Werror?由于無效型別之間的比較而出錯?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529461.html
下一篇:為if陳述句選擇條件
