break 语句后分配的值会发生什么?
What happens to assigned values after break statement?
这是我的某个程序的代码。但让我感到沮丧的是,在函数 getTotalX
中,在 for 循环的内部 if 块 中,当 flag 更新为 0、在 break 语句 之后,它 更新回 1。为什么会这样?我认为 break 语句可以帮助我从 for 循环中中断并直接继续执行下一个语句。
#include <stdio.h>
int getTotalX(int a_size, int* a, int b_size, int* b){
int min = a[a_size-1];
int max = b[0];
int count = 0;
for(int i = min; i <= max; i++){
int flag1 = 1, flag2 = 1;
for(int j = 0; j < a_size; j++){
printf("In array a,value of %d mod %d is %d \n",i,a[j],i%a[j] );
if((i % a[j]) != 0){
int flag1 = 0;
printf("flag1 set to 0. Check flag1 = %d\n",flag1);
break;
}
}
printf("Checkpoint2, value of flag1 = %d\n",flag1);
if(flag1 != 0){
for(int k =0; k < b_size; k++){
printf("In array b,value of %d mod %d is %d \n",b[k],i,b[k]%i );
if((b[k] % i) != 0){
int flag2 = 0;
printf("flag2 set to 0. Check flag2 = %d\n",flag2);
break;
}
}
}
printf("Checkpoint3, value of flag2 = %d\n",flag2);
if((flag1 == 1) && (flag2 == 1)){
printf("Value of flag1 = %d and flag2 = %d\n",flag1,flag2 );
printf("%d \n ",i);
count++;
}
}
return(count);
}
int main() {
int n;
int m;
scanf("%d %d", &n, &m);
int *a = malloc(sizeof(int) * n);
for(int a_i = 0; a_i < n; a_i++){
scanf("%d",&a[a_i]);
}
int *b = malloc(sizeof(int) * m);
for(int b_i = 0; b_i < m; b_i++){
scanf("%d",&b[b_i]);
}
int total = getTotalX(n, a, m, b);
printf("%d\n", total);
return 0;
}
所有的打印语句都是为了帮助我找出我哪里出错了。我可以更改逻辑以使其工作,但请帮助我理解为什么会这样?
在 for
内部的 if
块中声明的 int flag1
是 与声明的 int flag1
不同的变量在外部 for
的块中。一旦第二个 int flag1
被声明,前一个 被遮蔽 并且在遮蔽声明发生的块结束之前无法通过名称访问。
for(int i = min; i <= max; i++){
int flag1 = 1, flag2 = 1; // This is the outer flag1
for(int j = 0; j < a_size; j++){
printf("In array a,value of %d mod %d is %d \n",i,a[j],i%a[j] );
if((i % a[j]) != 0){
int flag1 = 0; // This is the inner flag1
// The inner flag1 and the outer flag1 are different variables.
// The inner flag1 is set to zero, the outer flag1 is not changed.
printf("flag1 set to 0. Check flag1 = %d\n",flag1);
break;
}
// The brace ending the block ends the scope of the inner flag1.
// From now on the name flag1 refers to the outer flag1.
}
这是我的某个程序的代码。但让我感到沮丧的是,在函数 getTotalX
中,在 for 循环的内部 if 块 中,当 flag 更新为 0、在 break 语句 之后,它 更新回 1。为什么会这样?我认为 break 语句可以帮助我从 for 循环中中断并直接继续执行下一个语句。
#include <stdio.h>
int getTotalX(int a_size, int* a, int b_size, int* b){
int min = a[a_size-1];
int max = b[0];
int count = 0;
for(int i = min; i <= max; i++){
int flag1 = 1, flag2 = 1;
for(int j = 0; j < a_size; j++){
printf("In array a,value of %d mod %d is %d \n",i,a[j],i%a[j] );
if((i % a[j]) != 0){
int flag1 = 0;
printf("flag1 set to 0. Check flag1 = %d\n",flag1);
break;
}
}
printf("Checkpoint2, value of flag1 = %d\n",flag1);
if(flag1 != 0){
for(int k =0; k < b_size; k++){
printf("In array b,value of %d mod %d is %d \n",b[k],i,b[k]%i );
if((b[k] % i) != 0){
int flag2 = 0;
printf("flag2 set to 0. Check flag2 = %d\n",flag2);
break;
}
}
}
printf("Checkpoint3, value of flag2 = %d\n",flag2);
if((flag1 == 1) && (flag2 == 1)){
printf("Value of flag1 = %d and flag2 = %d\n",flag1,flag2 );
printf("%d \n ",i);
count++;
}
}
return(count);
}
int main() {
int n;
int m;
scanf("%d %d", &n, &m);
int *a = malloc(sizeof(int) * n);
for(int a_i = 0; a_i < n; a_i++){
scanf("%d",&a[a_i]);
}
int *b = malloc(sizeof(int) * m);
for(int b_i = 0; b_i < m; b_i++){
scanf("%d",&b[b_i]);
}
int total = getTotalX(n, a, m, b);
printf("%d\n", total);
return 0;
}
所有的打印语句都是为了帮助我找出我哪里出错了。我可以更改逻辑以使其工作,但请帮助我理解为什么会这样?
在 for
内部的 if
块中声明的 int flag1
是 与声明的 int flag1
不同的变量在外部 for
的块中。一旦第二个 int flag1
被声明,前一个 被遮蔽 并且在遮蔽声明发生的块结束之前无法通过名称访问。
for(int i = min; i <= max; i++){
int flag1 = 1, flag2 = 1; // This is the outer flag1
for(int j = 0; j < a_size; j++){
printf("In array a,value of %d mod %d is %d \n",i,a[j],i%a[j] );
if((i % a[j]) != 0){
int flag1 = 0; // This is the inner flag1
// The inner flag1 and the outer flag1 are different variables.
// The inner flag1 is set to zero, the outer flag1 is not changed.
printf("flag1 set to 0. Check flag1 = %d\n",flag1);
break;
}
// The brace ending the block ends the scope of the inner flag1.
// From now on the name flag1 refers to the outer flag1.
}