【问题标题】:Difference between ++a and a+1 [duplicate]++a和a+1之间的区别[重复]
【发布时间】:2021-05-25 09:47:03
【问题描述】:

我了解 ++i 和 i++ 之间的区别。我觉得这个案子不一样,

我写了这段代码,

u_int8_t a = 255;
main (){
   
    printf("Num is %d\n", ++a ) ;
   

}

哪些输出

Num is 0

但是这段代码,

u_int8_t a = 255; 
main (){
   
    printf("Num is %d\n", a+1 ) ;
   

}

哪些输出,

Num is 256

输出不同的原因是什么?

【问题讨论】:

  • 1 被认为是一个 int。 int operator+ 隐式地将您的 u_int8_t 转换为 int,因此您得到的是 int 而不是 u_int8_t 的打印。请参阅上面的评论。
  • @Lundin 你已经“建议”了一个重复但没有关闭这个问题(你可能可以用你的 C 锤)。那是因为你不确定它是重复的吗?
  • @AdrianMole 这是因为我是提议的欺骗的作者,因此是部分的。我认为以自己的帖子为目标来结束问题是有问题的。
  • @Lundin OK - 公平评论。
  • @Lundin 它回答了我的问题,谢谢

标签: c variables


【解决方案1】:

表达式++a 在其类型(8 位无符号)的上下文中递增a,因此回绕为零。

表达式 a + 1 将 8 位无符号 a 添加到文字 1(这是一个 int),并且当您对不同类型执行此操作时,它们中较小的通常是“升级的”在添加之前到另一个。因此,您将添加两个 int 值,2551,并使用 no 包装。

这在 C 中称为“通常的算术转换”,标准中处理它的部分 C11 6.3.1.8 开始:

许多期望算术类型的操作数的运算符会以类似的方式导致转换和产生结果类型。目的是确定操作数和结果的通用实数类型。

在了解了一些浮点类型之后,以下说明了如何处理整数类型:

否则,整数提升将在两个操作数上执行。然后将以下规则应用于提升的操作数:

  • 如果两个操作数的类型相同,则无需进一步转换。
  • 否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换等级的类型的操作数将转换为具有较高等级的操作数的类型。
  • 否则,如果无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。
  • 否则,如果带符号整数类型的操作数的类型可以表示无符号整数类型的操作数类型的所有值,则将无符号整数类型的操作数转换为带符号整数类型的操作数的类型输入。
  • 否则,两个操作数都转换为无符号整数类型 对应带符号整数类型的操作数的类型。

您可能认为这是第四个要点,但实际上,它是序言与第一个要点的结合。 C11 6.3.1.1 中详述的“整数提升”实际上会将小于或等于等级的整数类型转换为 int 并将它们转换为 int(假设它可以表示原始类型的所有值,否则它会使其unsigned int)。


当然,另一个区别是第一个修改了a,而第二个没有。

【讨论】:

    【解决方案2】:

    你可以挤压变量和一元前缀++运算符之间的转换

    printf("Num is %d\n", ++(int){a} );   // 256
    

    需要复合字面量;只有一个演员有一个++ needs lvalue 错误。


    ++a 首先计算为 0 然后被转换。在a + 1 a 中首先被转换(并且不会增加)。

    【讨论】:

      猜你喜欢
      • 2016-03-15
      • 1970-01-01
      • 2014-12-05
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2017-04-26
      相关资源
      最近更新 更多