if (1) int a = 2;
这行代码是有效的C代码(至少可以编译),但无效的C代码(不能编译)。我知道两种语言之间有差异,但这次是出乎意料的。
我一直认为语法是
if (expr) statement
但这将使其在两种情况下都有效。
我的问题是:
这是因为C和C对语句的定义不同。
在C语言中,声明不被归类为语句。C复合语句由开头的{code>{code>、块项的选项列表和结束的{code>}{code>组成,其中块项是声明或语句。(这在C99中有所改变,C添加了在块内混合声明和语句的能力。)
在C语言中,声明被归类为语句(但仅当它位于复合语句中时)。这允许对复合语句进行更简单的定义:它是一个{code>,后跟一个可选的语句列表,后跟一个
}
。
这种差异没有太大的实际效果;解决这个问题总是可能的。一个影响是,在C语言中,在案例标签之后立即声明是合法的,但在C语言中它是不合法的。
克里斯(和其他人)的回答说明了语法是如何不同的。
我想指出if(1)int a=2;
在C中没有意义,但在C中有意义。由于我们没有块,只有1个语句/声明,因此声明的变量不可能进一步使用(它立即超出范围)。在C中,允许是没有意义的,但在C中,构造函数和析构函数可能会产生副作用,因此定义和初始化立即超出范围的变量可能很有用,并且必须允许。
这是C和C之间一个微妙而重要的区别。在C中,任何语句都可以是声明语句。在C中,没有声明语句这样的东西,相反,在任何复合语句中都可以出现声明而不是语句。
根据C语法(C17规范):
复合语句:“{”块项列表{br>块项列表:块项|块项列表块项{br>块项:声明|语句
来自C语法(C 14规范):
复合语句:"{"statement-seqopt"}"
statement-seq:语句|statement-seq语句
语句:...|声明-语句|...
不清楚为什么会存在这种差异,这只是语言发展的方式。C语法可以追溯到(至少)C 85。C语法是在C89和C99之间的某个时间引入的(在C89中,声明必须在块的开头)
两者之间有实际区别吗 和 除了第一个更短之外,一个优先级更高,还是更慢? 编辑: 我意识到这可能并不清楚,但通常是。
C++ 判断 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 语法 C++ 中 if 语句的语法: if(boolean_expression) { // 如果布尔表达式为真将执行的语句 } 如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false,则 if 语句结束后的第一组代码(闭括号后)将被执行。 C 语言把任何非零和非空的值假定为 t
C++ 判断 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。 语法 C++ 中 if...else 语句的语法: if(boolean_expression) { // 如果布尔表达式为真将执行的语句 } else { // 如果布尔表达式为假将执行的语句 } 如果布尔表达式为 true,则执行 if 块内的代码。如果布尔表达式为 fal
主要内容:只使用if语句,多个if else语句,if语句的嵌套前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条……一直到最后一条语句,这称为 顺序结构。 但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因为年龄不够,没有权限使用。这时候程序就需要做出判断,看用户是否是成年人,并给出提示。 在C语言中,使用 和 关键字对条件进行判断。请先看下面的代码: 可能的运行结果: 请输入你的年龄:23↙
这节课我们来学习下程序中另外一个非常重要的语句:if。 1. 语法 if (判断条件布尔运算) { 条件成立后运行的语句 } 这里的条件判断采用了布尔运算,也就是真值和假值两种情况。当 if 后面放入的条件判断语句的执行最终结果为真的时候,就会执行花括号中的语句,如果条件语句最终的结果为假,那么就不会执行花括号 中的语句,程序会跳过花括号中的代码段,继续执行后面的代码。 这里给出了真值表,以供
C++ 判断 在 C++ 中,嵌套 if-else 语句是合法的,这意味着您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 语法 C++ 中 嵌套 if 语句的语法: if( boolean_expression 1) { // 当布尔表达式 1 为真时执行 if(boolean_expression 2) { // 当布尔