问题声明差异?有人问到它们之间有什么区别
int i;
for (i=0; i<100; i++) {
//some loop....
}
Run Code Online (Sandbox Code Playgroud)
和:
for (int i=0; i<100; i++) {
//some loop....
}
Run Code Online (Sandbox Code Playgroud)
答案很明确; 第二个是C99,范围i仅限于循环.我没有C99,所以我无法测试,因此问一个问题:在下列情况下解决方案是什么:
int i = 32;
for (int i=i; i<100; i++) {
// some loop
}
Run Code Online (Sandbox Code Playgroud)
"新" i会用"旧"初始化i吗?或者旧的i已经无法进入,因为i已经宣布了一个新的?
Vla*_*cow 10
在这个for循环语句中
int i = 32;
for (int i = i; i < 100; i++) {
// some loop
}
Run Code Online (Sandbox Code Playgroud)
i在for语句中声明的变量具有不确定的值.问题是,只要定义了一个声明符(在这种情况下它由标识符组成i),它就会在给定的作用域中隐藏一个具有相同名称的实体.所以在这个宣言中
int i = i;
Run Code Online (Sandbox Code Playgroud)
变量i指的是它本身的右侧=.
另一个类似的例子 我们假设你有一个typedef.
typedef int Int;
Run Code Online (Sandbox Code Playgroud)
你可以在定义后写
Int Int;
Run Code Online (Sandbox Code Playgroud)
在这种情况下Int,类型对象的名称Int隐藏了typedef定义,您可能还没有编写
Int Another_Int;
Run Code Online (Sandbox Code Playgroud)
因为编译器会发出错误.
根据C标准(6.2.1标识符范围)
4 ...如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则标识符具有块作用域,该作用域终止于关联块的末尾.
更清楚的是在C++标准中写的(3.3.2声明点)
1名称的声明点紧接其完整的声明者(第8条)之后和初始化者之前(如果有的话),除非如下所述.[例如:
int x = 12;
{ int x = x; }
Run Code Online (Sandbox Code Playgroud)
这里第二个x用它自己的(不确定的)值初始化. - 末端的例子]
在此代码段中考虑到这一点
int i = 10;
{
int i[i];
}
Run Code Online (Sandbox Code Playgroud)
在复合语句中,声明的数组int i[10];是外部变量i用作数组大小,因为内部变量i只有在声明符完成时才会被声明.
参见C11 6.8.5.3:"如果子句-1是一个声明,它声明的任何标识符的范围是声明的剩余部分和整个循环,包括其他两个表达式".
第二个i是指i被定义的,而不是旧的.
整个事情是UB,因为你使用的是i(i在循环中定义的)没有先前赋值(或初始化)的值.
使用工作(但不同)示例进行编辑
您仍然可以通过使用指针来使用旧值
int i = 42;
int *old_i = &i;
for (int i = *old_i; i < 50; i++) printf("%d ", i);
Run Code Online (Sandbox Code Playgroud)
不,在任何情况下都是这样的
int i=i;
Run Code Online (Sandbox Code Playgroud)
是一个坏主意,因为第二个i是与第一个相同的对象,仍然没有初始化.
如果你坚持你可以做类似的事情
int tmp=i, i=tmp;
Run Code Online (Sandbox Code Playgroud)
有你想要的效果.
| 归档时间: |
|
| 查看次数: |
610 次 |
| 最近记录: |