C printf.这是有效的代码吗?

Nax*_*mus -1 c

以下代码使用gcc输出14.为什么?

printf("%d", (int*)2+3); // This code is meant to be obfuscated! 
Run Code Online (Sandbox Code Playgroud)

hac*_*cks 11

int *演员2作为地址.添加3将添加3*sizeof(int)到它.在你的系统上它似乎sizeof(int)是等于4,这就是它给予的原因2 + 12 = 14.

但是,您应该注意到给定的代码调用未定义的行为有两个原因:

  1. 对不指向数组元素的指针执行算术会导致未定义的行为.

  2. 7.21.6格式化输入/输出功能:

如果转换规范无效,则行为未定义.282)如果任何参数不是相应转换规范的正确类型,则行为未定义.

  • @JohnSmith:gnasher暗示指针算术仅在指向同一数组元素的指针上定义.另外,将指针传递给可变参数函数并假装它是一个数字也是UB本身. (6认同)
  • +1不给出典型和无聊*未定义的行为*答案,而只是解释OP他/她的代码的输出. (6认同)
  • **哦,很好,现在 OP 接受了这个_错误_和_误导_答案。你已经成功地向另一个程序员传播了更多的错误信息和危险的反知识。我希望你对自己满意,@hackks。** (5认同)
  • 实际上,它是未定义的行为,因为该指针不是指向数组元素的指针. (4认同)
  • 我部分与巴拉克马诺斯在一起.但是应该指出问题的实现定义和未定义的方面,并且一个好的答案也会试图阐明为什么标准使这些事情未定义/实现定义 - 行为不是因为它是不确定的未定义,标准委员会这样做/出于某种原因这样做.平台崩溃与错误对齐的指针,分段内存,带边界检查的调试实现,以及优化机会(我在这里看不到,但这是UB的常见原因)浮现在脑海中...... (4认同)
  • @barakmanos:-1甚至没有提到那是UB而是假装一切都很好. (3认同)
  • -1由于上述原因.你不能仅因为你没有取消引用指针而声称这一切都很好. (2认同)
  • @barakmanos:告诉你,你错过了关于答案的最重要的事实,它本身就是一个-1,并且即使通过详细解释特定实现中发生的事情,也无法治愈.此外,这只是UB的两个来源中的一个(此外,我们有实现定义的行为,但相比之下这是温和的). (2认同)
  • @mafso:我认为你在做我和Lightness都是一种伤害.我们特别反对在某些情况下指出某些实际实现中可能发生的情况,但是反对假装无效代码是有效的,并且还反对省略它无效的一些原因.做第一个可能会有趣的睡前阅读,但第二个对于可靠的程序绝对至关重要. (2认同)
  • @LightnessRacesinOrbit; 最后你赢了!**我向所有人道歉,提供了一些误导性答案**.现在纠正了.我忽略了指针运算无法在不指向数组元素的指针上进行的事实."**我希望你对自己很满意,@ hacks.**":当然不是.这不是故意的,我希望你能理解.任何人都可以犯错误(它的人性). (2认同)