C语言静态变量定义时赋初值和不赋初值
#include<stdio.h>main(){//intk;for(intk=0;k<3;k++){staticintx=3;//这个语句是否只在第一次循环中运行?pr...
#include <stdio.h>
main()
{
//int k;
for(int k=0;k<3;k++)
{
static int x=3; //这个语句是否只在第一次循环中运行?
printf("%d",x++);
}
printf("\n");
for(int k=0;k<3;k++)
{
static int x; //这个语句是否只在第一次循环中运行?
x=3; //这里是不是每次循环都起作用,为什么?
printf("%d",x++);
}
}
static int x;是不是就相当于static int x=0;
还有一问题:n=1;n+++n---n为什么是1?这不是与(n++)+(n--)-n一样吗? 展开
main()
{
//int k;
for(int k=0;k<3;k++)
{
static int x=3; //这个语句是否只在第一次循环中运行?
printf("%d",x++);
}
printf("\n");
for(int k=0;k<3;k++)
{
static int x; //这个语句是否只在第一次循环中运行?
x=3; //这里是不是每次循环都起作用,为什么?
printf("%d",x++);
}
}
static int x;是不是就相当于static int x=0;
还有一问题:n=1;n+++n---n为什么是1?这不是与(n++)+(n--)-n一样吗? 展开
4个回答
展开全部
239: m=n+++n---n;
00401047 mov eax,dword ptr [ebp-4](1)
0040104A mov dword ptr [ebp-8],eax(2)
0040104D mov ecx,dword ptr [ebp-4](3)
00401050 sub ecx,1 (4)
00401053 mov dword ptr [ebp-4],ecx (5)
00401056 mov edx,dword ptr [ebp-4] (6)
00401059 add edx,1 (7)
0040105C mov dword ptr [ebp-4],edx (8)
从上面可以看出来(1)(2)是计算m=n+n-n的,(4)(5)(6)是计算n--的,(6)(7)(8)是计算n++的,这也符合++、--是从右到左的运算规则。
m=(n++)+(n--)-n;
0040102F mov eax,dword ptr [ebp-4]
00401032 mov dword ptr [ebp-8],eax
00401035 mov ecx,dword ptr [ebp-4]
00401038 sub ecx,1
0040103B mov dword ptr [ebp-4],ecx
0040103E mov edx,dword ptr [ebp-4]
00401041 add edx,1
00401044 mov dword ptr [ebp-4],edx
两者对比下就知道了,加了两个括号是等价的
00401047 mov eax,dword ptr [ebp-4](1)
0040104A mov dword ptr [ebp-8],eax(2)
0040104D mov ecx,dword ptr [ebp-4](3)
00401050 sub ecx,1 (4)
00401053 mov dword ptr [ebp-4],ecx (5)
00401056 mov edx,dword ptr [ebp-4] (6)
00401059 add edx,1 (7)
0040105C mov dword ptr [ebp-4],edx (8)
从上面可以看出来(1)(2)是计算m=n+n-n的,(4)(5)(6)是计算n--的,(6)(7)(8)是计算n++的,这也符合++、--是从右到左的运算规则。
m=(n++)+(n--)-n;
0040102F mov eax,dword ptr [ebp-4]
00401032 mov dword ptr [ebp-8],eax
00401035 mov ecx,dword ptr [ebp-4]
00401038 sub ecx,1
0040103B mov dword ptr [ebp-4],ecx
0040103E mov edx,dword ptr [ebp-4]
00401041 add edx,1
00401044 mov dword ptr [ebp-4],edx
两者对比下就知道了,加了两个括号是等价的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
main()
{
//int k; (该句被注释掉了)
for(int k=0;k<3;k++)
{
static int x=3; //这个语句是否只在第一次循环中运行?(仅在本次循环中运行)
printf("%d",x++);
}
printf("\n");
for(int k=0;k<3;k++)(该句出错,已定义过一个k的变量,应改为for(k=0;k<3;k++),k从定义开始在整个main函数中有效)
{
static int x; //这个语句是否只在第一次循环中运行?(仅在本次循环中运行,且x默认值为0)
x=3; //这里是不是每次循环都起作用,为什么?(c语言语句执行时,在main函数中从上而下依次执行,因此该句共执行3次)
printf("%d",x++);
}
两者相当;
n=1;n+++n---n=(n++)+(n--)-n=1+1-1;
因为n++,n--是在该句(定义int k; k=n+++n---n;)执行后执行,n的值才改变
main()
{
//int k; (该句被注释掉了)
for(int k=0;k<3;k++)
{
static int x=3; //这个语句是否只在第一次循环中运行?(仅在本次循环中运行)
printf("%d",x++);
}
printf("\n");
for(int k=0;k<3;k++)(该句出错,已定义过一个k的变量,应改为for(k=0;k<3;k++),k从定义开始在整个main函数中有效)
{
static int x; //这个语句是否只在第一次循环中运行?(仅在本次循环中运行,且x默认值为0)
x=3; //这里是不是每次循环都起作用,为什么?(c语言语句执行时,在main函数中从上而下依次执行,因此该句共执行3次)
printf("%d",x++);
}
两者相当;
n=1;n+++n---n=(n++)+(n--)-n=1+1-1;
因为n++,n--是在该句(定义int k; k=n+++n---n;)执行后执行,n的值才改变
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
static 是初始化~注意初始化和赋值是不一样的~~
赋值语句重复执行多次`在一个程序中,而变量只初始化一次.
而static静态变量作用域是可以覆盖到每个块的.(可以把每次的循环体看做一个小块)
//static int x;是不是就相当于static int x=0;
//还有一问题:n=1;n+++n---n为什么是1?这不是与(n++)+(n--)-n一样吗?
这个虑一遍过程.读到第一个操作数n,继续读右面操作符,最先组成操作符的为一个操作符~~那么一个'+'就是一个操作符,后面的++是前自增.后面的以此类推.
不过这种问题不必过于纠缠.现实中代码写成这样的人,不是脑障碍就是脑残疾
赋值语句重复执行多次`在一个程序中,而变量只初始化一次.
而static静态变量作用域是可以覆盖到每个块的.(可以把每次的循环体看做一个小块)
//static int x;是不是就相当于static int x=0;
//还有一问题:n=1;n+++n---n为什么是1?这不是与(n++)+(n--)-n一样吗?
这个虑一遍过程.读到第一个操作数n,继续读右面操作符,最先组成操作符的为一个操作符~~那么一个'+'就是一个操作符,后面的++是前自增.后面的以此类推.
不过这种问题不必过于纠缠.现实中代码写成这样的人,不是脑障碍就是脑残疾
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的补充问题我来回答下:
static定义的全局变量在没有赋值时默认是0 正确
下面一个问题建议你查:算术符号优先级
static定义的全局变量在没有赋值时默认是0 正确
下面一个问题建议你查:算术符号优先级
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询