Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
ansi c 1999 TC3中的逗号运算符示例_C_C99_Undefined Behavior - Fatal编程技术网

ansi c 1999 TC3中的逗号运算符示例

ansi c 1999 TC3中的逗号运算符示例,c,c99,undefined-behavior,C,C99,Undefined Behavior,当我试图弄明白时,!0的结果是实现定义的,期望它不等于零。我刚刚读到一些让我困惑的东西 (顺便问一下,它可能在一些实现中-1或1,或者它的定义是否严格?如果有人能在评论中告诉我,那就好了) 但我真正的问题是: 在 6.5.17逗号运算符2 据说: 如果试图修改逗号运算符的结果或 在下一个序列点之后访问它,行为未定义 在下一行中,有一个示例,说明如何使用逗号运算符将参数解析为函数 f(a, (t=3, t+2), c); 但就我目前所知,这个例子是未定义的行为,不是吗? 由于t被分配3,在下一个

当我试图弄明白时,
!0
的结果是实现定义的,期望它不等于零。我刚刚读到一些让我困惑的东西

(顺便问一下,它可能在一些实现中
-1
1
,或者它的定义是否严格?如果有人能在评论中告诉我,那就好了)

但我真正的问题是:

6.5.17逗号运算符2

据说:

如果试图修改逗号运算符的结果或 在下一个序列点之后访问它,行为未定义

在下一行中,有一个示例,说明如何使用逗号运算符将参数解析为函数

f(a, (t=3, t+2), c);
但就我目前所知,这个例子是未定义的行为,不是吗? 由于
t
被分配
3
,在下一个序列中,它增加了
2

但是标准没有提到这个例子是无效的


还是一个赋值不能理解为修改?

逗号操作符引入了一个序列点,因此行为应该被很好地定义(首先
t
被设置为
3
,然后
2
被添加到
t
中,产生结果
5
,但将
3
保留在
t
).

逗号运算符引入一个序列点,因此行为应该被很好地定义(首先
t
被设置为
3
,然后
2
被添加到
t
中,产生结果
5
,但将
3
保留在
t
中)

  • !0
    计算结果为
    1
  • (t=3,t+2)
    中,分配和访问
    t
    之间有一个序列点。表达式已定义,其计算结果为
    5
    ,并将值
    3
    保留在
    t
    中。如果两者之间没有序列点,例如,
    (t=3)+(t+2)
    ,那么它将是未定义的
  • !0
    计算结果为
    1
  • (t=3,t+2)
    中,分配和访问
    t
    之间有一个序列点。表达式已定义,其计算结果为
    5
    ,并将值
    3
    保留在
    t
    中。如果两者之间没有序列点,例如,
    (t=3)+(t+2)
    ,那么它将是未定义的

  • 我不知道是什么促使你问这个问题。您从中选取示例的标准部分明确指出:

    如语法所示,逗号运算符(如本款所述)不能 出现在使用逗号分隔列表中项目的上下文中(例如函数或列表的参数) 初始值设定者的名称)另一方面,它可以在带括号的表达式或 在这样的条件运算符的第二个表达式中 上下文。在函数调用中

            f(a, (t=3, t+2), c)
    
    该函数具有 三个参数,第二个参数的值为5


    强调相关部分以澄清您的疑问。

    我不确定是什么促使您提出这个问题。您从中选取示例的标准部分明确指出:

    如语法所示,逗号运算符(如本款所述)不能 出现在使用逗号分隔列表中项目的上下文中(例如函数或列表的参数) 初始值设定者的名称)另一方面,它可以在带括号的表达式或 在这样的条件运算符的第二个表达式中 上下文。在函数调用中

            f(a, (t=3, t+2), c)
    
    该函数具有 三个参数,第二个参数的值为5


    强调了相关部分以澄清您的疑问。

    但标准没有提到示例无效。
    这意味着示例有效。是的,您不是说。。。但我的问题是为什么它是有效的?据我所知,规则不是==(等于)和!=(不等于)运算符与关系运算符类似,只是优先级较低。93)如果指定的关系为真,则每个运算符的结果为1,如果为假,则为0。我自己找到的。
    但是标准没有提到这个例子是无效的。
    这意味着这个例子是有效的。是的,你不是说。。。但我的问题是为什么它是有效的?据我所知,规则不是==(等于)和!=(不等于)运算符与关系运算符类似,只是优先级较低。93)如果指定的关系为真,则每个运算符的结果为1,如果为假,则为0。我自己找到的。但是为什么
    printf(“%d%d”,t++,+++t)
    无效呢?函数调用中的逗号不能理解为sequencepoint吗?@Zaibis完全正确。
    printf(“%d%d”,t++,+++t)
    中的逗号不是逗号运算符,标准中说逗号运算符是序列点的段落不适用于它们。啊,那么解析到函数的参数是单个序列吗?@Zaibis函数调用中的参数是未排序的。这意味着其中两个不允许修改和修改或读取和修改同一内存位置。形容词“unsequenced”不是C99标准(我记得)的一部分,但它被非正式地用来描述两个没有被序列点分隔的表达式,例如in,但是为什么
    printf(“%d%d”,t++,+++t)
    无效?函数调用中的逗号不能理解为sequencepoint吗?@Zaibis完全正确。
    printf(“%d%d”,t++,+++t)
    中的逗号不是逗号运算符,标准中说逗号运算符是序列点的段落不适用于它们。啊,那么解析到函数的参数是单个序列吗?@Zaibis函数调用中的参数是未排序的。这意味着其中两个不允许修改和修改,或读取和修改mo