01/10/2018, 11:46

Mọi người giải thích giúp em lệnh goto trong C

[code]
#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:;
}

}[/code]

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ỉ

Dark.Hades viết 13:52 ngày 01/10/2018

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ổ

SuperHackerProNo1ty viết 13:59 ngày 01/10/2018

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ỉ

SuperHackerProNo1ty viết 14:01 ngày 01/10/2018

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

Dark.Hades viết 13:53 ngày 01/10/2018

tại sao lệnh printf vẫn chạy nhỉ

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

Dark.Hades viết 13:56 ngày 01/10/2018

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

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);
            }
		}
	}
}
rogp10 viết 13:52 ngày 01/10/2018

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

Student X viết 13:51 ngày 01/10/2018

sqrt(i)

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

rogp10 viết 13:52 ngày 01/10/2018

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

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.
Student X viết 13:55 ngày 01/10/2018

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ỉ?

rogp10 viết 13:51 ngày 01/10/2018

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ỉ?

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

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.

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

Student X viết 14:00 ngày 01/10/2018

okie!!! it’s fine!!!

SuperHackerProNo1ty viết 13:52 ngày 01/10/2018

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

rogp10 viết 14:01 ngày 01/10/2018

i=2 j=2 thì for bên trong sẽ k chạy, lệnh printf tại sao lại không thực hiện

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

Bài liên quan
0