【问题标题】:Does printf alter variables?printf 会改变变量吗?
【发布时间】:2015-03-17 04:23:29
【问题描述】:

我不确定在 printf 语句中增加变量是否会将有价值的值保存到变量中。

int x = 0;

printf("x=%d\n", ++x);
printf("x=%d\n", x);

输出是

x=1
x=0

或

x=1
x=1

我从未学过 C 的基础知识,想知道它如何与 C++ 匹配。

我确实了解前/后增量,但我担心如果我在函数范围内递增它,则在第一个 printf() 中执行 ++x 不会保存。

【问题讨论】:

  • 是什么阻止您运行代码?
  • operator++ 修改值。这就是重点。
  • 这与printf无关。在 C 中,所有变量都是按值传递的。由于您没有在任何地方获取地址 (&),因此printf 无法修改您的变量。
  • @MarounMaroun 我目前无法使用任何代码。只是想知道
  • @JonathonReinhart 我现在明白了,谢谢

标签: c printf increment


【解决方案1】:

输出将为 1。

你的表情++x将是

x = x+1;

在printf() 中你会得到1

所以 x 的值在这里用预增量运算符修改,在第二行的 printf() 中打印 x 的新值 1

printf() 只是打印x 的值,它不会修改您的变量

注意前增量和后增量之间的区别。

使用后增量,您将在第一个 printf() 中获得 0,因为 x 的值由 printf()'s %d 获取,后来 x 递增导致 @987654334 的值@ 在第二个 prinf() 中为 1

【讨论】:

    【解决方案2】:

    前/后自增运算符总是修改其操作数的值。

     int main(int argc, char **argv) {
         int x = 0;
    
         printf("x=%d\n", ++x);
         printf("x=%d\n", x);
     }
    
     char@char:~$ ./a.out
     x=1
     x=1
    

    正如其他人指出的那样,在这种情况下,后自增运算符将返回 0...

     int main(int argc, char **argv) {
         int x = 0;
    
         printf("x=%d\n", x++);
         printf("x=%d\n", x);
     }
    
     char@char:~$ ./a.out
     x=0
     x=1
    

    但 x 的值仍将被修改。

    要获得预期的输出,请将 ++x 替换为 x+1。

    【讨论】:

      【解决方案3】:

      增加变量中的值不是基于 printf 语句。它会 由递增或递减运算符完成。所以增量运算符的工作是 将值加一。

      所以它完成了工作。

      Output of this would be 
      x=1
      x=1
      

      【讨论】:

        【解决方案4】:

        改变 x 的不是 printf,而是 C 表达式可能有副作用。就像 C++ 表达式一样。

        ++x 递增 x 然后返回该值。
        x++ 返回 x 的值,然后递增 x。

        所以这里的输出是

        x=1
        x=1
        

        但对于x++,它会是

        x=0
        x=1
        

        【讨论】:

          【解决方案5】:

          printf 家族本身不会修改变量(尽管内存损坏),但 表达式 ++x 会, 其效果是增加 @987654323 @ 然后使用增加的值作为表达式的结果。

          但这与printf 无关,表达式只是被评估,因此它可以传递 到printf。

          所以你会看到1 1而不是1 0。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-11-20
            • 2021-06-20
            • 2023-03-16
            • 1970-01-01
            • 1970-01-01
            • 2013-03-17
            • 2010-12-04
            相关资源
            最近更新 更多