#include <iostream>
using namespace std;
int main()
{
int arr[8];
int n = 0;
while (n < 8)
{
arr[n] = n;
}
for (n = 0; n < 8; n )
{
cout << arr[n]<<" ";
}
}
輸出-垃圾 1 2 3 4 5 6 7 預期輸出- 1 2 3 4 5 6 7 8
uj5u.com熱心網友回復:
該陳述句arr[n] = n;具有未定義的行為,因為它是未指定的 ifn在用作 中的下標之前是否遞增arr。
在您的情況下,對于您的編譯器,增量首先發生,因此您永遠不會向陣列arr[0]末尾分配任何內容并寫入arr[8]陣列末尾。
解決此問題的一種方法是將其拆分為兩個陳述句:
arr[n] = n;
n;
求值順序稱為排序,隨著語言的發展,規則也發生了變化。重要的是,在 C 17 中, 的增量n將在計算存盤結果的地址之前發生,因此您總是以未初始化的第一個元素結束,并且寫入越過陣列的末尾。
uj5u.com熱心網友回復:
打開你的警告標志!你的程式可以有未定義的行為;
main.cpp:34:18: warning: operation on 'n' may be undefined [-Wsequence-point]
34 | arr[n] = n;
| ^~~
main.cpp:34:16: warning: iteration 7 invokes undefined behavior [-Waggressive-loop-optimizations]
34 | arr[n] = n;
| ~~~~~~~^~~~~
main.cpp:32:14: note: within this loop
32 | while (n < 8)
也許你可以這樣做:
int arr[8] { };
int n = 0;
while ( n < 8 )
{
arr[n] = n 1;
n;
}
for ( n = 0; n < 8; n )
{
std::cout << arr[n] << " ";
}
uj5u.com熱心網友回復:
在 C 中,=符號右側 (RHS) 的運算式首先被計算,因為如果你沒有計算它是什么,你就不能在變數中存盤(分配)一個值!
int myAge = 10 10; // calculates 20 first, then stores it.
在分配給陣列中的位置 n 之前,您正在更改 n 的值 - 在回圈的第一次迭代中將其從 0 增加到 1 - 因此將結果 1 分配給陣列 [1]。
為什么?那么, n和n 是復雜的(并且經常混淆)在C 運營商,因為他們倆都是數學和賦值運算子。 n 本質上等同于:
n = n 1;
return n;
其中 n 更接近:
n = n 1;
return n -1;
您可以使用更簡單的運算子更明確地對其進行編碼:
arr[n] = n 1;
n = n 1;
.. 或者像在輸出代碼中一樣使用 for 回圈。對兩者使用相同的回圈結構可能會幫助您獲得一致的結果。
你并不是唯一一個在與這個問題斗爭的人。Chris Lattner 認為一元運算子 和--一元運算子的混淆和錯誤的潛力足以超過它們從 Swift 3 中洗掉的好處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388773.html
標籤:C
