0

代码:

#include <stdio.h>

int main()
{
    int a=10;
    static int b=2;
    a = a+1;
    b = b-1;
    printf("%d \n",a);
    printf("%d \n",b);
    printf("%d \n","%d",a,b);
    return 0;
}

输出:

11
1
4210693

我的问题: b 是一个静态变量,那么它的值如何在使用的第二个 printf() 函数中发生变化?第三个 printf() 函数是有意义的,因为它给出了一个错误。

4

2 回答 2

3

对于程序开头的初学者,您更改​​了静态变量b

b = b-1;

关键字static没有关键字的含义const

另一方面,在这个调用中printf显然有一个错字

printf("%d \n","%d",a,b);
               ^^^^

实际上,您正在尝试将指向字符串文字的指针"%d"作为整数输出。

也就是说,该函数有四个参数,第一个参数中只有一个转换说明符。

编译器可能会发出警告,指出调用printf.

你可以写例如:)

printf("%d \n" "%d",a,b);

在这种情况下,输出将是

11
1

因为上面的调用等价于

printf("%d \n%d",a,b);

但似乎你的意思是

printf("%d %d\n", a, b);

因此,两个静态变量都不会自发改变。

于 2021-02-05T19:07:19.180 回答
2

printf签名是

int printf ( const char * format, ... );

第一个参数是格式字符串,后面的所有参数都是格式说明符(以 % 开头的子序列)。

printf("%d \n","%d",a,b);

上面的代码调用了未定义的行为,因为第一个格式说明符%d用于表示十进制整数值,而与此说明符匹配的参数是"%d" 类型为const char *.

您应该将其更改为:

printf("%d %d\n",a,b);
于 2021-02-05T19:00:55.417 回答