for循环和size_t的奇怪行为

Pul*_*nha 1 c printf for-loop size-t

 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = 0; i < size; i++) {
    printf("%d ", i);
 }
Run Code Online (Sandbox Code Playgroud)

上面的代码(使用gcc)outptus

4

0 1 2 3

 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = -1; i < size; i++) {
    printf("%d ", i);
 }
Run Code Online (Sandbox Code Playgroud)

此代码(i初始化为-1)仅输出4并且循环中没有任何内容.

 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = -1; i < (int) size; i++) {
    printf("%d ", i);
 }
Run Code Online (Sandbox Code Playgroud)

添加强制转换使代码再次运行正常.输出是

4

-1 0 1 2 3

第二个代码出了什么问题?为什么printf在任何地方都不会出错?

Jam*_*lis 9

i < size
Run Code Online (Sandbox Code Playgroud)

i签名并且size是无符号时,则i在执行比较之前将其转换为无符号.这是所谓的通常算术转换的一部分.

-1被转换为无符号类型,则结果是通过无符号的类型的最大可能值表示的,从而i < size当为假i-1为任何值size.

当您使用时i < (int)size,两个操作数<都是类型的int,因此不需要执行任何转换,并且由于两个操作数都已签名,因此您将获得预期的结果.

  • 不,左或右并不重要,有些类型比其他类型更具优势. (2认同)