01/10/2018, 08:51

Mọi người cho em hỏi về câu C++ này cái ạ!

sao nó lại ra 2,4,6… nhỉ , theo em nghĩ nó phải ra 1,2,3,4,…
mọi người giải thích vs ạ!thank all

Khang Việt viết 11:04 ngày 01/10/2018

++i nó sẽ cộng i lên 1 trước , khác với i++ thực hiện sau !

Khoa NTA viết 11:07 ngày 01/10/2018

Trong biểu thức của while thì i được tăng 1 lần (++i), rồi sau lệnh ‘cout’ lại tăng thêm 1 lần nữa (i++) => tăng 2 đơn vị thì thành ra +2 thôi .

Trần Hoàn viết 11:08 ngày 01/10/2018

while (++i<=n*n) là kiểu viết của mấy người lười :)), nếu viết như vậy thì sẽ không cần viết i++ ở trong khối while

NG viết 11:04 ngày 01/10/2018

Đầu tiên bạn cần phải hiểu cách viết ++i là như thế nào đã.
Edit : chỗ này mình nhớ sai nên viết bậy, sửa lại, có gì không đúng góp ý mình sửa tiếp .
i++ có nghĩa là đưa tôi gía trị hiện tại của i sau đó thực hiên phép tính i = i + 1
++i có nghĩa là thực hiên phép i = i + 1 sau đó đưa gía trị mới của i
khi bạn viết while(++i < nn), phép tính i = i + 1 sẽ được thưc hiện trước, sau đó là i <= nn.
trong vòng lặp của bạn lại có thêm i++. nên mỗi vòng lặp i sẽ tăng lên 2.

Mình không có test nhưng mình nghĩ nếu bạn in gía trị i sau khi hoàn thành vòng lặp sẽ là 27.

Cá nhân mình khuyên khong nên dùng hay lạm dụng những lối viết như thế này, hãy viết những dòng code đơn giản, dễ hiểu. Điều này có ích khi bạn chuyển sang ngôn ngữ mới, một cách viết truyền thống sẽ giúp bạn làm quen nhanh hơn. Quan trọng hơn là khi bạn tham gia một dự án nhiều người cùng làm, nó giúp đồng nghiệp của bạn đọc code của bạn dễ dàng và nhanh hơn. Nhưng cách viết như thế theo cá nhân mình ngoài việc thể hiện ra chẳng giup ích gì được nhiều, có đôi khi lâu lâu nhìn lại dòng code cũ của mình nhiều khi mình mất rất nhiều thời gian để hiểu lúc trước mình viết cái khỉ gì, đối với việc fix bug hay cải thiện code thì rất khó khăn.

Luôn có những cách viết code đơn gian dễ hiểu hơn, đừng phức tạp hóa.

viết 11:03 ngày 01/10/2018

++i có nghĩa là đưa tôi gía trị hiện tại của i sau đó thực hiên phép tính i = i + 1khi bạn viết while(++i < nn), phép tính i <= nn sẽ ddược thưc hiện trước, sau đó là i = i + 1.

i = i + 1 được thực hiện trước, rồi mới so sánh i < n*n sau chứ.

NG viết 11:04 ngày 01/10/2018

@tntxtnt : bạn có nhầm không ?
Bạn có C++ sẵn test giùm mình
int i = 1 ;
print(++i);
print(i) ;

Cái bạn nói mình nghĩ là i++

viết 10:54 ngày 01/10/2018

in ra 2 2. ++i luôn tính trước mà.

http://en.cppreference.com/w/cpp/language/operator_precedence

thứ tự ưu tiên toán tử nè. ++i ưu tiên thứ 3, trong khi toán tử so sánh ưu tiên thứ 8. ++i tính trước rồi mới tới <. i++ thì cũng tính trước, nhưng nó trả về copy của i nên tạo cảm giác là i++ tính sau.

NG viết 11:00 ngày 01/10/2018

Cảm ơn mình sẽ nghiên cứu, có thể mình hiểu sai.

viết 11:08 ngày 01/10/2018

viết ++i < n thì có thể hiểu là 2 bước: i = i + 1; return i < n;
viết i-- > n thì có thể hiểu là 3 bước: copy = i; i = i - 1; return copy > n

NG viết 11:08 ngày 01/10/2018

Đúng rồi, là mình nhớ ngược
int main()
{
int n1 = 1;
int n2 = ++n1;
int n3 = ++ ++n1;
int n4 = n1++;
// int n5 = n1++ ++; // error
// int n6 = n1 + ++n1; // undefined behavior
std::cout << "n1 = " << n1 << ‘\n’
<< "n2 = " << n2 << ‘\n’
<< "n3 = " << n3 << ‘\n’
<< "n4 = " << n4 << ‘\n’;
}

n1 = 5
n2 = 2
n3 = 4
n4 = 4

viết 11:04 ngày 01/10/2018

chắc lâu ko xài mà

NG viết 10:55 ngày 01/10/2018

Không nên xài không nên xài, ha ha. Xài xong 1 ngày đẹp trời nhìn muốn chửi thề , thằng cờ hó nào viết cái này thế

viết 11:04 ngày 01/10/2018

để viết code cho gọn chứ gì

ví dụ void strcpy(char* dst, const char* src) thì có thể viết 1 dòng while (*dst++ = *src++);

muốn duyệt ngược 1 mảng từ a[n-1] về a[0] có thể xài “toán tử” -->: for (int i = n; i --> 0; ) { /* xét a[i] ...*/ }

xài nhiều lắm:
http://en.cppreference.com/w/cpp/algorithm/copy#Possible_implementation
http://en.cppreference.com/w/cpp/algorithm/unique#Possible_implementation
v.v…
mấy chục hàm có sẵn trong <algorithm> xài ++i với i++ tá lả luôn

NG viết 10:58 ngày 01/10/2018

Mình hiểu, nhưng ý mình là luôn có những cách viết truyền thống chung của nhiều ngôn ngữ, giup người đọc code dễ hiểu hơn, thay vì viết tắt, viết thêm it dòng để code đẹp hơn, dễ hiểu hơn
for(int i = n, i–, i > 0), lúc đó bạn dễ kiểm soát gía trị của i hơn.

ví dụ này là đơn giản nên có thể mọi người không quan tâm, nhưng 1 ,ngày đẹp trời bạn gặp 1 dòng code mà bạn muốn gặp thằng viết để đấm cho 1 phat kiểu ++i = 5 = ++i = i++ …

Có nhiều cách viết nhưng chọn cách đơn giản nhất, là điều mình muốn nói.

Trần Hoàn viết 10:52 ngày 01/10/2018

Và chúng ta có một câu lệnh vô dụng: i=i++; =))

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

Câu này sai lè rồi vì nó undefined mà. Đừng có straw man vậy

Trần Hoàn viết 11:03 ngày 01/10/2018

trong phép gán, phía bên phải bao giờ cũng được tính trước mà. i++ thì return ra i nên i=i++ phải tương đương với i=i trong trường hợp i+1 không bị overflow chứ?

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

Đang bàn C++ thì câu này là undefined vì vừa gán vừa tăng giữa hai sequence point.

Trừ &&, || và , thì không có toán tử nhị phân nào quy định tính toán hạng nào trước hay sau.

Bài liên quan
0