Cần giải thích giúp đoạn code C có lệnh goto

#include <stdio.h>
#include <math.h>
int main()
{
	int n,i,j,k;
	int *mang = (int *)calloc(n,sizeof(int));
	scanf("%d",&n);
	for(i=2;i<n;i++)
	{
		for(j=2;j<=sqrt(i);j++)
		{
			if(i%j==0)
			{
				goto thoat;
			}
			
		}
		printf("%d ",i);
		thoat:;
	}
}

khi lệnh if được thực hiện, goto thoạt ra và thực thiện câu lệnh sau dòng thoat:; đúng không, tại sao lệnh printf vẫn chạy nhỉ

thoat:; bạn đặt trong scope for

Đừng học thằng goto nữa, không ai còn code nó đâu, viết khéo lại ăn táng thì khổ

1 Like

nhưng nếu nó nhảy và thực hiện câu lệnh sau dòng thoat:; thì nó phải nhảy lên for 1 để thực hiện chứ

vì luồng chương trình đã kế thúc rồi, phải bắt đầu lượt loop mới chứ nhỉ :frowning:

thay thế lệnh goto trong th này như nào vậy bác

Bạn kiểm tra lại giá trị printf là gì sẽ hiểu.

Theo điều kiện bạn viết thì chỉ khi nào i không chia hết cho j thì nó mới không printf, còn lại nó vẫn printf bình thường

Mình không hiểu ý tưởng (code) của bạn, nhưng mà sẽ dùng break, có lẽ như thế này:

#include <stdio.h>
#include <math.h>
int main()
{
	int n,i,j,k;
	int *mang = (int *)calloc(n,sizeof(int));
	scanf("%d",&n);
	for(i=2;i<n;i++)
	{
		for(j=2;j<=sqrt(i);j++)
		{
			if(i%j==0)
			{
				break;
			} else {
                printf("%d ",i);
            }
		}
	}
}
1 Like

^ Bạn xem lại nhé, câu printf vẫn nằm trong vòng lặp j.

2 Likes

đây là lý do vì sao printf vẫn được thực hiện nhé!!!

1 Like

Code vẫn chạy bon bon đây: https://repl.it/Ll9C, sự việc không như thớt nói.

Có hai vấn đề ở đây:

  1. Sử dụng goto.
  2. Câu goto này nằm ngay trong if nên điều kiện đúng thì nó mới chạy. Có cảm giác như thớt chưa bao h chạy tay code thì phải.
1 Like

Chào bạn!!!

  1. Đầu tiên là mình hiểu sai vấn đề. mình đang hiểu rằng bạn chủ topic muốn hỏi tại sao printf vẫn được thực hiện khi đã chạy tới label thoat:;
    vì mình thấy khi so sánh j =2 với sqrt(i) (i=2). thì câu lệnh if sẽ không được thực hiện ở vòng lặp này.

2 .Không biết dựa vào gì mà bạn có thể đánh giá người khác chạy code bằng tay hay k nhỉ? :slight_smile:

Bạn đã trả lời dùm mình rồi:

Nhưng dù gì thì cũng nên đợi xem sao.

okie!!! it’s fine!!! :slight_smile:

mình k nói là code không chạy, ý mình không thể hiểu được code.

thứ nhất: i=2 j=2 thì for bên trong sẽ k chạy, lệnh printf tại sao lại khong thực hiện ???

thứ 2: lượt lặp thứ 2 là i=3, j bắt đầu bằng 2 thì điều điện lặp for thứ 2 vẫn sai, và printf được thực hiện. tương tự với i=4 nó k in ra vì for thứ 2 đúng và go to đến cuối dòng cuối loop 1 ==> đúng
i=5 thì cũng chạy đúng

Mình copy code ngay đầu chạy thử rồi, vẫn hiện số 2 đấy chứ.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?