fork download
  1. #include <assert.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. #define T(expr) do { \
  6.   int cond = (expr); \
  7.   printf("%s -> %s\n", #expr, cond ? "true" : "false"); \
  8.   assert(cond); \
  9.   }while(0)
  10.  
  11. int main() {
  12. size_t x = 0;
  13. T(sizeof(int[x]) == 0);
  14. T(x == 0);
  15.  
  16. T(sizeof(int[++x]) == sizeof(int[1]));
  17. T(x == 1);
  18.  
  19. char a[x], b[x];
  20. T(sizeof(++x ? a : b) == sizeof(char*)); // arrays are converted to pointers
  21. T(x == 1);
  22.  
  23. const size_t n = 10;
  24. char c[n];
  25. T(sizeof(++x ? a : c) == sizeof(char*));
  26. T(x == 1);
  27.  
  28. T(sizeof(++x ? c : a) == sizeof(char*));
  29. T(x == 1);
  30.  
  31. T(sizeof(a) == sizeof(char[1]));
  32. T(sizeof(c) == sizeof(char[n]));
  33. T(sizeof(c) == n*sizeof(char));
  34.  
  35. // T(++x ? int[x] : int[n]); // compilation error
  36. return (x == 1) ? EXIT_SUCCESS : EXIT_FAILURE;
  37. }
  38.  
Success #stdin #stdout 0s 1720KB
stdin
Standard input is empty
stdout
sizeof(int[x]) == 0 -> true
x == 0 -> true
sizeof(int[++x]) == sizeof(int[1]) -> true
x == 1 -> true
sizeof(++x ? a : b) == sizeof(char*) -> true
x == 1 -> true
sizeof(++x ? a : c) == sizeof(char*) -> true
x == 1 -> true
sizeof(++x ? c : a) == sizeof(char*) -> true
x == 1 -> true
sizeof(a) == sizeof(char[1]) -> true
sizeof(c) == sizeof(char[n]) -> true
sizeof(c) == n*sizeof(char) -> true