有人可以解释为什么 sizeof() 用一元运算符返回这些值吗?

Ans*_*shu 4 c operators sizeof unary-operator

#include <stdio.h>

int main() {
    int a;
    char b;
    short int c;
    double d;
    printf("%d %d %d %d\n", sizeof(a), sizeof(b), sizeof(c), sizeof(d));
    printf("%d %d %d %d\n", sizeof(+a), sizeof(+b), sizeof(+c), sizeof(+d));
    printf("%d %d %d %d\n", sizeof(-a), sizeof(-b), sizeof(-c), sizeof(-d));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

32 位编译器输出:

4 1 2 8
4 4 4 8
4 4 4 8

如果我更改 . 中的符号,输出相同sizeof(),例如sizeof(-a). 我想知道为什么会发生这种情况。+-运算符是否在促进数据类型?

Lun*_*din 5

是的,一元+-运算符 integer 将小整数类型提升为int. C17 6.5.3.3:

一元 + 运算符的结果是其(提升的)操作数的值。对操作数执行整数提升,结果具有提升的类型。

一元 - 运算符的结果是其(提升的)操作数的负数。对操作数执行整数提升,结果具有提升的类型。

有关整数提升的详细信息,请参阅隐式类型提升规则


您可以_Generic尝试找出任何表达式的实际类型:

#include<stdio.h>

#define type(x) _Generic((x),    \
  int:   puts(#x " is int"),     \
  short: puts(#x " is short"),   \
  char:  puts(#x " is char") );  \

int main (void)
{
  int a;
  char b;
  short int c;
  
  type(a); type(+a);
  type(b); type(+b);
  type(c); type(+c);
}
Run Code Online (Sandbox Code Playgroud)

输出:

a is int
+a is int
b is char
+b is int
c is short
+c is int
Run Code Online (Sandbox Code Playgroud)