8

I don't know why the sizeof operator is not evaluated in a for loop condition at run time. I am trying this simple code with different C compilers but it always print nothing. But if I replace sizeof(i) with 4 then it works fine:

for(int i = -2; i <= 4; i++)

#include <stdio.h> int main() { for(int i = -2; i <= sizeof(i); i++) printf("Hello World"); return 0; } 

4 Answers 4

9

The problem is , the result of sizeof() operator is of type size_t, which is an unsigned type.

Next, in the comparison, i <= sizeof(i) as per the usual arithmetic conversion rules, -2, which is a signed value, gets promoted to an unsigned value, producing a huge value, evaluating the condition to false. So the loop condition is not satisfied and the loop body is not executed.

Run your program through a debugger and see the values in each step, it'll be more clear to you once you see the promoted values in the comparison.

Sign up to request clarification or add additional context in comments.

1 Comment

This is true if the rank of size_t is greater than or equal to the rank of int, otherwise the code will work as both values will be converted into int. It's the "usual arithmetic conversions" rather than the "arithmetic promotion rules" which may be confused for "integer promotions".
4

sizeof yields a value of unsigned type variety (size_t). The i is converted to that type and the comparison executed as

(size_t)-2 <= 4 

something like 4000000000 < 4

Comments

2

you need to typecast sizeof(i) into int. that should solve the problem.

so just replace for(int i = -2; i <= sizeof(i); i++) with for(int i = -2; i <= (int) sizeof(i); i++)

Comments

0

sizeof() returns size_t which is an unsigned type. You can try this code instead:

#include<stdio.h> int main() { int i=-2,j; j=(int)sizeof(i); for(i=-2;i<=j;i++) printf("HELLO\n"); return 0; } 

You can typecast sizeof() to int.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.