将 strlen(s) 值分配给整数会改变输出,为什么?

Assigning strlen(s) value to an integer is varying the output, WHY?

char s[100];
cin>>s;
int x=strlen(s);
if((x-2)>=9)
cout<<s[0]<<x-2<<s[x-1]<<endl;    
else
cout<<s<<endl;

输入 'a' 的输出是 'a' 但是

char s[100];
cin>>s;
if((strlen(s)-2)>=9)
cout<<s[0]<<strlen(s)-2<<s[strlen(s)-1]<<endl;    
else
cout<<s<<endl;

此程序对于相同输入 'a' 的输出是 a18446744073709551615a。

只需将 strlen(s) 值赋给一个整数就可以避免问题的发生。为什么 ??

18446744073709551615a 的垃圾值从何而来,如果在第二种情况下编译“if”条件,那么为什么?

当您输入 a 时,strlen 将 return unsigned (size_t) 11 - 2 不会是 -1 而是在 0 处回绕并给你一个 非常 大无符号整数(在你的例子中是 18446744073709551615)。

strlen returns size_t - unsigned 类型。

根据integral conversion规则,strlen(s)-2的类型保持无符号,对于任何小于2的strlen(s)都会溢出,回绕并给出一个大的正值(264-1 在你的例子中)。

当您第一次将 strlen(s) 分配给 int 变量时,该值将转换为类型 int,并且 1-2 的结果变为 -1。您可以通过将 strlen(s) 转换为 int:

来实现相同的目的
  if ((static_cast<int>(strlen(s))) - 2) >= 9) ...

或者只是将-2移到比较的另一边:

  if (strlen(s) >= 9 + 2) ...