2017-03-07 5 views
2
#include<stdio.h> 
#include<string.h> 

void printlength(char *s, char *t) { 
    unsigned int c=0; 
    int len = ((strlen(s) - strlen(t)) > c) ? strlen(s) : strlen(t); 
    printf("%d\n", len); 
} 

void main() { 
    char *x = "abc"; 
    char *y = "defgh"; 
    printlength(x,y); 
} 

私はそれをコンパイルすると、それは私がどのように変換がここで行われている理解していない、を与えるが、このCコードではどのように変換が行われますか? > C)</strong> - <strong>(strlenを(t)とstrlenを(S)):

+4

これは非常に貧弱なコードです。(strlen(s) - strlen(t)) 'は、符号なし演算であるため_always_> = 0です。 – chux

+0

したがって、オプティマイザは、 'printf("%d \ n "、(int)strlen(s));' –

+0

@MMに変換できます。 )strlen(t)); – chux

答えて

4

これはコードが非常に悪いです。(strlen(s) - strlen(t))です。符号なし演算では常に> = 0です。 strlen()によって返されるタイプは、size_t、一部の符号なしタイプです。したがって、値が等しい場合を除いて、符号なし数学ラップアラウンドのために差は常に正の数になります。

そしてsの長さはt異なっていてもint len = strlen(s);

同様のコードを使用するより良い方法は、追加することだけです。

// ((strlen(s) - strlen(t)) > c) 
(strlen(s) > (c + strlen(t)) 

注:数学は、その後タイプintを締結して行われるようSIZE_MAX <= INT_MAXと珍しいプラットフォームでは、差が負であることができます。しかし、cとの比較はunsignedであり、unsignedとなり、負の差が0より大きい非常に大きな数にラップアラウンドします。@Paul Hankin

+0

いつも? SIZE_MAX <= INT_MAXの場合はどうなりますか? –

+1

@PaulHankin負の減算結果が 'unsigned int'変数との比較によって未署名に昇格されるので、差はありません –

+0

@PaulHankin減算で使用される型は' c'の型によって影響を受けませんので、常に差があります> = 0.結果の比較は、 'size_t'と' unsigned'の広い方に適用されます。指定されていないにもかかわらず、「size_t」よりも広い「符号なし」のプラットフォームを見つけることは決してありませんでした。おそらく64ビットグラフィックプロセッサーがあなたの前提を採用するかもしれません。 – chux

関連する問題