当str为空时,’for’循环条件下strlen(str) – 1的值是多少?

我正在分析一个场景:

char str[] = ""; // Understand 

如果我理解strlen(str) ,那么它就是0.这没关系。

 printf(" %d, %ul, %u, %d, %ul, %u", strlen(str), strlen(str), strlen(str), strlen(str) - 1, strlen(str) - 1, strlen(str) - 1); 

输出是:

0,0l,0,-1,4294967295l,4294967295

我也理解这些。

 for (int i = 0; i < strlen(str) - 1; i++) { } 

在这里我不明白strlen(str) - 1的值在for循环条件中是什么。

strlen(str) - 1在for循环中给出值4294967295。 这是为什么? 为什么不-1?

这个说法

 printf(" %d, %ul, %u, %d, %ul, %u", strlen(str),strlen(str),strlen(str),strlen(str)-1,strlen(str)-1,strlen(str)-1); 

显示当strlen( str ) - 1像无符号整数一样输出时,例如使用格式说明符%ul其值为4294967295l

在循环的条件下

 for (int i=0;i 

编译器必须确定左右操作数的公共类型,以确定条件结果的类型

 i 

右操作数strlen(str)-1类型为size_t (函数strlen的返回类型是size_t )。 它是无符号整数类型,通常对应于unsigned long 。 它不能有负值。 存储在此类对象中的任何值都将被解释为非负值,并且输出显示strlen(str)-1值等于4294967295l 。 (如果使用类型说明符%zu ,则可以获得实际值,因为可能不会排除size_t甚至可以对应无符号long long)

右操作数的类型为int 。 它的等级至少不大于size_type的等级。 因此,两个操作数都转换为size_t类型并具有非负值。

确定公共类型的这个过程称为通常的算术转换。 很明显, 4294967295l大于0.因此,如果没有break语句,循环将迭代4294967295l次。

如果以下列方式重写循环中的条件,则可以获得预期结果

 for ( int i = 0; i < ( int )strlen( str ) - 1; i++ ) 

strlen返回size_t ,这是一个无符号整数。 因此,如果strlen(str)0strlen(str)-1将产生SIZE_MAX (最大值size_t可以保持)。

您应该使用%zu来打印size_t值。