c语言中for中声明变量,C中for循环中的变量重新声明
當嘗試為多個平臺編譯以下(簡化)代碼時,我發現它在某些方面是失敗的,即IBM的xlC_r.進一步的調查發現,它也沒有進來和cl..它與g和Solaris的CC成功編譯.
這是代碼:
int main()
{
int a1[1];
bool a2[1];
for (int *it = a1, *end = a1+1; it != end; ++it) {
//...
bool *jt = a2, *end = a2+1;
//...
}
}
xlC_r錯誤:
"main.cpp", line 8.25: 1540-0400 (S) "end" has a conflicting declaration.
"main.cpp", line 6.25: 1540-0425 (I) "end" is defined on line 6 of "main.cpp".
ang子錯誤:
main.cpp:8:25: error: redefinition of 'end' with a different type
bool *jt = a2, *end = a2+1;
^
main.cpp:6:25: note: previous definition is here
for (int *it = a1, *end = a1+1; it != end; ++it) {
^
來錯誤:
"ComeauTest.c", line 8: error: "end", declared in for-loop initialization, may not
be redeclared in this scope
bool *jt = a2, *end = a2+1;
^
問題是為什么這是一個錯誤?
看看2003年的標準,它說如下(6.5.3):
The for statement
for ( for-init-statement; condition; expression ) statement
is equivalent to
{
for-init-statement;
while ( condition ) {
statement;
expression;
}
}
except that names declared in the for-init-statement are in the same
declarative-region as those declared in condition
這里沒有聲明的名稱.
另外,它說(6.5.1):
When the condition of a while statement is a declaration, the scope
of the variable that is declared extends from its point of declaration
(3.3.1) to the end of the while statement. A while statement of the form
while (T t = x) statement
is equivalent to
label:
{
T t = x;
if (t) {
statement;
goto label;
}
}
再次,我不知道這是相關的,因為沒有聲明在條件.所以給出6.5.3的等效重寫,我的代碼應該是一樣的:
int main()
{
int a1[1];
bool a2[1];
{
int *it = a1, *end = a1+1;
while (it != end) {
//...
bool *jt = a2, *end = a2+1;
//...
++it;
}
}
}
這顯然會允許結束重新聲明.
總結
以上是生活随笔為你收集整理的c语言中for中声明变量,C中for循环中的变量重新声明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 共阳极数码时钟c语言程序,基于51单片机
- 下一篇: 项目的数据存储c语言,C语言项目实战项目