Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C if语句中的声明_C - Fatal编程技术网

C if语句中的声明

C if语句中的声明,c,C,if语句中的声明在没有括号的情况下是否非法?例如: if (argc == 2) char* str = "Two"; else char* str = "Not two"; 将需要转换为: if (argc == 2) { char* str = "Two"; } else { char* str = "Not two"; } 出于好奇,为什么会这样?我理解需要有多个语句的大括号

if
语句中的声明在没有括号的情况下是否非法?例如:

if (argc == 2)
    char* str = "Two";
else
    char* str = "Not two";
将需要转换为:

if (argc == 2) {
    char* str = "Two";
} else {
    char* str = "Not two";
}
出于好奇,为什么会这样?我理解需要有多个语句的大括号,例如:

if (something)
    printf(something);
    printf(something);
如果上述内容真正“指”以下内容而不是明确的braeces:

if (something) {
    printf(something);
}
printf(something);

但是,如果一个语句/声明只包含一个
,为什么允许使用它呢

if语句(带有
else
子句)的语法为:

if(表达式)语句else语句

这是:

char* str = "Two";
不是语句而是声明,因此在第一个代码段中无效

第二个带大括号的代码段之所以有效,是因为大括号表示复合语句,而复合语句中可能同时包含语句和声明

然而,请注意,即使在编译的第二种情况下,一旦
if
语句完成且无法引用,则每个子块中定义的变量
str
将超出范围。您可能想要的是:

char *str;
if (argc == 2) {
    str = "Two";
} else {
    str = "Not two";
}
或相当于:

char *str;
if (argc == 2)
    str = "Two";
else
    str = "Not two";

顺便说一句,你的最后一段代码并不含糊不清。@KonradRudolph嗯,我的意思是,我的意图是错误的——我希望
printf
只出现在
if
语句中,但这里它出现在它之外。但是是的,这对编译器来说并不含糊,也许我的语言在这个问题上不够精确。无论如何——我已经删除了这个词,谢谢你指出。好吧,它来自语法——它是
if(…)语句
statement
可以是
复合语句
,也就是
{block item list}
block item
可以是
声明
。这与
开关(1){case1:inta;}
无效的方式相同。但至于为什么。。。事情就是这样。如果没有
{
,没有要分配的变量。如果它确实允许在那里声明,您认为声明的范围会是什么?如果它是包含块,您将对同一个变量有两个声明,这是不允许的。如果它不是包含块,您将有一个没有引用位置的变量声明谢谢,回答得很好。关于你回答的后半部分,是的——实际上这是我的下一个问题,我刚才问了,但你似乎已经回答了!