Sie*_*geX 34 c variables declaration
当我第一次被介绍到CI被告知总是在函数的顶部声明我的变量.现在我对语言有了很强的把握,我将重点放在编码风格上,特别是限制了变量的范围.我已经阅读了限制范围的好处,我遇到了一个有趣的例子.显然,C99允许你这样做......
for (int i = 0; i < 10; i++)
{
puts("hello");
}
Run Code Online (Sandbox Code Playgroud)
我原以为一个变量的作用域是由最内层的限制周围的花括号{ },但在上面的例子中int i出现通过的,即使是他们的之外声明for循环的花括号中范围有限.
我试图扩展上面的例子fgets()来做我认为类似的东西,但这两个都给了我一个语法错误.
fgets(char fpath[80], 80, stdin);*见说明**
fgets(char* fpath = malloc(80), 80, stdin);
那么,在C99中声明变量的确切位置是合法的吗?for循环示例是规则的例外吗?这适用于while和do while循环吗?
*注意**:我甚至不确定这在语法上是否正确,即使我可以在那里声明char数组,因为fgets()它正在寻找指向char的指针而不是指向char 数组80的指针.这就是我尝试该malloc()版本的原因.
Jon*_*ler 36
在C99中,您可以在需要的地方声明变量,就像C++允许您这样做.
void somefunc(char *arg)
{
char *ptr = "xyz";
if (strcmp(arg, ptr) == 0)
{
int abc = 0; /* Always could declare variables at a block start */
somefunc(arg, &ptr, &abc);
int def = another_func(abc, arg); /* New in C99 */
...other code using def, presumably...
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在'for'循环的控件部分声明一个变量:
for (int x = 0; x < 10; x++) /* New in C99 */
Run Code Online (Sandbox Code Playgroud)您不能在'while'循环或'if'语句的控件部分声明变量.
C99标准说:
6.8.5.3 for语句
该声明
for ( clause-1 ; expression-2 ; expression-3 ) statement
Run Code Online (Sandbox Code Playgroud)
行为如下:表达式expression-2是在每次执行循环体之前计算的控制表达式.在每次执行循环体之后,表达式-3被评估为void表达式.如果clause-1是一个声明,它声明的任何变量的范围是声明的剩余部分和整个循环,包括其他两个表达式; 它是在控制表达式的第一次评估之前按执行顺序到达的.如果clause-1是表达式,则在第一次控制表达式求值之前将其计算为void表达式.
我要注意的第一件事是你不应该混淆
for (int i = 0; i < 10; i++) {
puts("hello");
}
Run Code Online (Sandbox Code Playgroud)
和
fgets(char* fpath = malloc(80), 80, stdin);
Run Code Online (Sandbox Code Playgroud)
第一个是控制结构,第二个是函数调用.控制结构以与函数调用的方式完全不同的方式评估其parens()内的文本.
第二件事是......我不明白你想说的是:
如果你试图在for-loop体内使用i,编译器会立即给你一个错误.
你为for循环列出的代码是C中非常常见的结构,变量"i"确实应该在for循环体内可用.即,以下应该工作:
int n = 0;
for (int i = 0; i < 10; i++) {
n += i;
}
Run Code Online (Sandbox Code Playgroud)
我在误读你在说什么吗?