#include<stdio.h>
#include<string.h>
void printlen(char *s,char *t){
int c=0;
int len=((strlen(s)-strlen(t)>c)?strlen(s):strlen(t));
printf("%d",len);
}
void main(){
char *x="abc";
char *y="defgh";
printlen(x,y);
}
strlen(s)是 3 并且strlen(t)是 5,那么為什么strlen(s)-strlen(t)>c評估為真?
uj5u.com熱心網友回復:
該strlen函式回傳一個size_t無符號型別的值。
因此,從無符號 5 中減去無符號 3 會得到一個非常大的無符號數。這個數字大于 0,所以條件為真,導致strlen(s)被評估并分配給len。
減法的結果應該被轉換int為正確存盤一個有符號的值。
int len=(((int)(strlen(s)-strlen(t))>c)?strlen(s):strlen(t));
更好的是,strlen轉換每個的結果以避免從無符號到有符號的超出范圍的轉換,這是實作定義的:
int len= ((int)strlen(s)-(int)strlen(t))>c)?strlen(s):strlen(t);
uj5u.com熱心網友回復:
int len=((strlen(s)-(int)strlen(t)>c)?strlen(s):strlen(t));
printf("%d",len);
是平等的:
int len;
if((strlen(s) - strlen(t) > c)
len = strlen(s);
else
len = strlen(t);
printf("%d",len);
首先,printf("%d",len);是無條件的。無論len(s) - strlen(t) > c是trueor false,都printf("%d",len);被執行。
其次,strlenreturnsize_t是 的別名unsigned long long,所以(strlen(s) - strlen(t) > c)總是true。
你應該將它型別轉換為 int
int len=(((int)strlen(s)-(int)strlen(t)>c)?strlen(s):strlen(t));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341529.html
