静态变量更改值没有显示错误?
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);
所以两个静态变量都不会自发改变。
代码:
#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);
所以两个静态变量都不会自发改变。