静态变量更改值没有显示错误?

static variable changing value with no error displayed?

代码:

#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() 函数是有意义的,因为它给出了一个错误。

printf签名是

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

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

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

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

您应该将其更改为:

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

初学者在程序开头更改了静态变量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);

所以两个静态变量都不会自发改变。