代码说明
Explaination for the code
代码的输出是 3?请explain.According对我来说应该是
5.After 删除 "unsigned" 我仍然得到输出 3.
#include<stdio.h>
#include<string.h>
void main(){
unsigned int c=0;
int len;
char x[20]="abc";
char y[20]="defgh";
if((strlen(x)-strlen(y))>c)
len=strlen(x);
else
len=strlen(y);
printf("%d",len);
}
因为 size_t
在 C
中未签名。因此,负数的比较会产生正数。 (有符号数的符号扩展位在无符号情况下会产生很大的值)。然后将该值与 0
进行比较 - 为真则进入第一个条件。输出 3.
即使您从 C
中删除无符号数,strlen
减法的结果也会产生比 0 大得多的正数。这就是为什么您总是得到 3。
After removing "unsigned" still i got the output as 3.
变量c
是声明为unsigned还是signed
并不重要
unsigned int c=0;
问题在于标准函数 strlen
returns 类型 size_t
的对象根据定义是无符号类型。
size_t strlen(const char *s);
所以在这个表达式中
strlen(x)-strlen(y)
结果被解释为无符号整数值。由于 strlen( x )
小于 strlen( y )
那么您将得到一个非常大的无符号值或至少是一个非零正值。
你可以这样写
if( strlen(x) > strlen(y) )
len=strlen(x);
else
len=strlen(y);
并且将变量 len 声明为 size_t
.
类型会更正确
size_t len;
//...
printf("%zu\n",len);
^^^
代码的输出是 3?请explain.According对我来说应该是 5.After 删除 "unsigned" 我仍然得到输出 3.
#include<stdio.h>
#include<string.h>
void main(){
unsigned int c=0;
int len;
char x[20]="abc";
char y[20]="defgh";
if((strlen(x)-strlen(y))>c)
len=strlen(x);
else
len=strlen(y);
printf("%d",len);
}
因为 size_t
在 C
中未签名。因此,负数的比较会产生正数。 (有符号数的符号扩展位在无符号情况下会产生很大的值)。然后将该值与 0
进行比较 - 为真则进入第一个条件。输出 3.
即使您从 C
中删除无符号数,strlen
减法的结果也会产生比 0 大得多的正数。这就是为什么您总是得到 3。
After removing "unsigned" still i got the output as 3.
变量c
是声明为unsigned还是signed
unsigned int c=0;
问题在于标准函数 strlen
returns 类型 size_t
的对象根据定义是无符号类型。
size_t strlen(const char *s);
所以在这个表达式中
strlen(x)-strlen(y)
结果被解释为无符号整数值。由于 strlen( x )
小于 strlen( y )
那么您将得到一个非常大的无符号值或至少是一个非零正值。
你可以这样写
if( strlen(x) > strlen(y) )
len=strlen(x);
else
len=strlen(y);
并且将变量 len 声明为 size_t
.
size_t len;
//...
printf("%zu\n",len);
^^^