你看到它用于for循环语句,但它在任何地方都是合法的语法.您在其他地方找到了什么用途,如果有的话?
C定义了至少3个级别的"常量表达式":
6.6第3段内容如下:
常量表达式不应包含赋值,递增,递减,函数调用或逗号运算符,除非它们包含在未评估的子表达式中.
那么这意味着1,2不是一个恒定的表达式吗?
第8段内容如下:
算术常量表达式应具有算术类型,并且只能具有整数常量,浮点常量,枚举常量,字符常量和sizeof表达式的操作数.算术常量表达式中的转换运算符只能将算术类型转换为算术类型,除非作为sizeof运算符的操作数的一部分,其结果为整数常量.
什么是操作数(union { uint32_t i; float f; }){ 1 }.f?如果1是操作数,那么这可能是一个算术常量表达式,但如果{ 1 }是操作数,则显然不是.
编辑:另一个有趣的观察:7.17第3段要求结果是offsetof类型的整数常量表达式size_t,但offsetof据我所知,标准实现不需要是标准的整数常量表达式.这当然是可以的,因为允许实现(在6.6第10段下)接受其他形式的常量表达式,或者实现offsetof宏__builtin_offsetof而不是通过指针减法.但是,这种观察的本质是,如果你想offsetof在需要整数常量表达式的上下文中使用,你真的需要使用实现提供的宏而不是自己的.
我在考试中看到了这一点,当我尝试时,我很惊讶.我在网上尝试过,它也有效.所以我认为这是C语言.
为什么这样?这种赋值语法的用例是什么?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int i = (1,2,3,4,5);
printf("%d", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 来自C in a Nutshell:
常量表达式
编译器识别源代码中的常量表达式,并用它们的值替换它们.结果常量值必须可以在表达式的类型中表示.只要允许使用简单常量,就可以使用常量表达式.
常量表达式中的运算符遵循与其他表达式中相同的规则.但是,因为常量表达式是在转换时计算的,所以它们不能包含修改变量的函数调用或操作,例如赋值.
什么是常量表达式?它没有定义常量表达式
常量表达式和不可修改的左值之间有什么区别(例如数组名称,已声明的左值const)
常量表达式总是非左值吗?
不可修改的左值是否是常量表达式?
我之前已经声明了变量及其值,但之前我从未在一行中完成过.
如果我写
A, B = 0.0, 2;
Run Code Online (Sandbox Code Playgroud)
这是否意味着
A = 0
Run Code Online (Sandbox Code Playgroud)
和
B = 2?
Run Code Online (Sandbox Code Playgroud) 我刚开始读C
情况:
x =(y = 3,(z = ++ y + 2)+ 5)
首先评估y = 3然后评估(z = ++ y + 2)
我的问题 :
首先应该评估(z = ++ y + 2),因为逗号(,)的优先级远小于括号
我的思维方式:
由于优先顺序,我们选择外括号
然后我们需要评估括号
在这个(括号)下,我再次开始应用优先规则
所以我先拿内支架进行评估
PS:
这不是重复
我已经通过这些链接但仍然无法理解