【问题标题】:Does scanf function cause any logical problems with operators? [duplicate]scanf 函数是否会导致运算符出现任何逻辑问题? [复制]
【发布时间】:2019-01-24 09:16:18
【问题描述】:

我认为描述问题的最佳方式是实际显示这个简单代码的输出: Image contains code and output

#include<stdio.h>
int main()
{
int a=5,b;

b=a-++a;
printf("%d %d",a,b);

return 0;
}

如您所见,返回的值在逻辑上是正确的。 ++a 将 a 的值增加到 6。然后 b=6-6=0。

但是,当我使用 scanf 将 'a' 的值作为用户输入时,会发生以下情况: Image contains code and output

#include<stdio.h>
int main()
{
int a,b;
scanf("%d",&a);
b=a-++a;
printf("%d %d",a,b);

return 0;
}

结果不应该相同还是我在这里遗漏了一些简单的东西?

【问题讨论】:

  • 嗨,欢迎来到 stackoverflow。请不要发布代码图像,在您的问题中写下代码。见How to Askminimal reproducible example
  • 添加代码,谢谢。
  • 它们都是未定义的行为。所以没有太多可以解释输出的差异。
  • @Irtiza :还请添加您遇到的问题的输出(即不仅仅是在图像上) - 然后您可以完全删除图像。

标签: c operators scanf


【解决方案1】:

a - ++a 形式的值未定义,因为 '-' 参数的执行顺序未定义。

在第一种情况下,编译器知道 a 的值,因此它可以优化代码,最后在编译时就知道了,而不是在第二种情况下。

在编译时或执行时计算的值不同的事实是 a - ++a 形式的结果未定义的结果。

【讨论】:

  • 在在线编译器(ideone)上执行这两个代码会给出相同的输出(6 0)。可能是什么原因?它取决于编译器版本还是其他什么?
  • @VikramKumar 虽然行为未定义,但它可以从一个编译器更改为另一个编译器或在同一编译器的两个版本之间更改
  • @Downvoter 这个答案可以通过什么方式改进?
  • @Bathsheba 不是我的 dv,但扩展是错误的。执行顺序无关紧要。只有序列点。如此明显的最常见的重复之一+部分错误的答案。值得DV(也决定DV)
  • @P__J__:您的执行顺序很好。我也会投反对票。我不认为答案投票应该是问题重复的功能,正确的做法是关闭/删除问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多