【问题标题】:what is typeof((c) + 1) in C什么是 C 中的 typeof((c) + 1)
【发布时间】:2010-12-14 07:38:29
【问题描述】:

我在 C 中遇到了一个表达式,例如

typeof((c) + 1) _tmp = c;

这到底是什么意思?

感谢您的回复。

只有一个疑问?如果 c 的类型是 struct 而不是原始类型,那 +1 会做什么?

【问题讨论】:

标签: c gcc


【解决方案1】:

纯 C(不是 C++)中的 typeof 运算符是对标准的 GCC 附加。它告诉编译器您要使用括号中的表达式的类型。

如上使用typeof,您可以声明您或在该上下文中未知类型的变量,使用另一个变量的类型作为引用。它也可以用于铸造。

typeof 内部的+ 操作有一个特殊的效果。 typeof((c) + 1) 表示“c 的类型,或 1 的类型,以提升后保留的为准”。请记住,例如,在涉及 int 的操作中使用 chars 时,会将其提升为 int,将 int 提升为浮点数,将浮点数提升为双精度数等。

所以,typeof(int_variable + char_variable)int,因为 char 将被提升为 int 以执行操作。

请注意,只有编译器可以解决这个问题:typeof 不计算,没有价值,在运行时没有任何反应。

typeof的完整描述可以是found here

【讨论】:

  • @Santiago Lezica:type of 1 是什么?对不起,我没有得到那个
  • @user* hmm 假设当您在代码中写入1 时,编译器假定这是一个值为1 的整数。1 的类型是int
  • @Santiago Lezica:那么编译器特定的类型是什么?
  • @user* 好吧,你可以放心地打赌它会在任何地方都是int,但正如我所说,typeof 无论如何都是 GNU C 编译器 (GCC) 功能,它不是标准的C.
  • 如果这里c的类型是struct,那么+1会做什么??
【解决方案2】:

create var _tmp st _tmpcint 的向上转换(最大值)类型,并将其设置为 c 的值。

例如

char c -> int _tmp // char(c) + 1 is int
float c -> float _tmp // float(c) + 1 is float

【讨论】:

  • +1 会做什么?我了解 typeof 的使用,但不明白 typeof 中的 + 1 会做什么
  • @zom 强制 tmp 变为 int 如果c 是“更小”然后是 int
  • +1 在哪里发挥作用?
  • @Stilgar 是因为整数提升吗?
  • 简而言之:是的,这是由于整数提升。
【解决方案3】:

除了其他答案之外,这里的+ 非常微妙。它允许c 是表达式或类型。

  • 如果它是一个表达式,那么如前所述, c 被提升为 int(至少) 以及整个表达式的类型 至少具有int 的整数等级。
  • 如果是类型表达式 c 周围的括号使其成为 值+1 的转换。那么结果类型就是c

对于这两种杂技,重要的是c 是算术类型,还需要注意的是,这里的这个技巧可能会丢失c 的符号。所以typeof 扩展的这种用法并没有看起来那么有用。在大多数情况下,使用 uintmax_tintmax_t 就足够了。

【讨论】:

    【解决方案4】:

    它不是标准的 C。C 没有 typeof 这样的东西(除非你正在处理用户定义的东西)。

    typeof 通常是编译器扩展(很可能是 GCC 编译器)。你可以在这里阅读它

    http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

    【讨论】:

    • 这真的不能解释+1在做什么
    • @SiegeX:这也没有解释 = 在做什么以及 ; 在做什么。当像“它在做什么?”这样广泛的问题时被问到时,由做出答案的人决定该说什么,不该说什么。我认为以上就足够了。
    • 恭喜您的决定。但是,我和许多其他人(在其他答案上查看其他 cmets)认为对 +1 所做的事情的解释是有序的,因为它在 typeof 的范围内并不直观。
    【解决方案5】:

    比较代码,

    typeof((c) + 1) _tmp = c;
    

    typeof(c) _tmp = c;
    

    typeof 允许类型或变量的参数。现在将c 视为,

    • struct { int a; int b }
    • 指向struct { int a; int b }的指针
    • 实际文字int

    除了提升char根据uʍop ǝpısdn,宏还可以防止struct分配。所以下面的代码不会编译,

    struct { int a; int b } c;
    typeof((c)+1) _tmp = c;
    

    出于效率和代码大小的原因,人们可能希望禁止 struct 赋值,尤其是在通用宏中。

    【讨论】:

      【解决方案6】:

      Typeof 返回一个类型,并在编译时进行评估。

      整个语句意味着声明一个变量tmp,其类型与c相同(通常)。

      它可能声明一个相关的或不同的类型,因为 c+1 的类型可以与 c 不同。 (这在 C++ 中更有可能)。

      【讨论】:

      • 即使在 C 中,如果 ccharshort 并且 int 更大,那么表达式 c+1 的类型将由 int 组成。如果c 是更大的整数类型或者是floatdouble,那么表达式的类型就是c 的类型。它不需要 C++ 对类型产生一些混淆......
      • 如果这里c的类型是struct,那么+1会做什么??
      【解决方案7】:

      在我看来,仅用于指针,typeof((c) + 1) = typeof(c); 所以这可以确保传递的参数是指针

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 2017-06-01
        • 2015-10-18
        • 2011-10-14
        • 1970-01-01
        • 2018-09-26
        相关资源
        最近更新 更多