Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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中允许的逗号分隔,或者我们需要为每一个单独的语句?_C_Comma - Fatal编程技术网

是";算术表达式;用C中允许的逗号分隔,或者我们需要为每一个单独的语句?

是";算术表达式;用C中允许的逗号分隔,或者我们需要为每一个单独的语句?,c,comma,C,Comma,在C中,是下面的语句 a+=3,b=c*2,d=a+b; 相当于以下语句块: a+=3; b=c*2; d=a+b; 我相信你明白我的意思了。我们能在C语言的同一个语句中安全地使用多个用逗号分隔的数学表达式吗?在什么情况下这会造成问题 它们是一样的 在C语言中,逗号运算符计算其左侧,忽略返回值(例如,x=y的返回值是新值),计算右侧并返回其结果(如果有)。逗号运算符的使用是在不使用(例如,放弃)其值的情况下计算和获取左手边的内容的副作用。如果您像下面这样考虑逗号表达式列表,可能会更容易: (

在C中,是下面的语句

a+=3,b=c*2,d=a+b;
相当于以下语句块:

a+=3;
b=c*2;
d=a+b;
我相信你明白我的意思了。我们能在C语言的同一个语句中安全地使用多个用逗号分隔的数学表达式吗?在什么情况下这会造成问题

它们是一样的


在C语言中,逗号运算符计算其左侧,忽略返回值(例如,x=y的返回值是新值),计算右侧并返回其结果(如果有)。逗号运算符的使用是在不使用(例如,放弃)其值的情况下计算和获取左手边的内容的副作用。

如果您像下面这样考虑逗号表达式列表,可能会更容易:

((a += 3, b = c * 2), d = a + b)
首先计算最里面的逗号表达式:

a += 3, b = c * 2
该表达式将分两步计算:

a += 3
b = c * 2
a+=3
的结果将被编译器丢弃,但赋值仍然发生,只是返回的结果被丢弃了。第一个逗号表达式的结果是
b
(它将是
c*2
(无论是什么)

第一个逗号表达式的结果位于下一个逗号表达式的左侧:

b = c * 2, d = a + b
然后将按以下顺序进行排序:

b = c * 2
d = a + b
表达式
b=c*2
的结果被丢弃(但仍在计算赋值),完整表达式的结果是
d
(即
a+b


整个表达式的结果将是
d

阅读。是。。它们是一样的..好吧,它们不完全一样:在代码审查日,前者可能会让你产生一些假笑。(许多C/C++程序员不鼓励在这种情况下使用逗号运算符。);-)@DevSolar:不过,希望代码的审阅者和作者都考虑到它出现的上下文。如果只是在函数的中间,则应该使用三个语句。如果它出现在多个语句无法执行的地方(例如,在
for
循环的最后一个子句中),则可能存在这样的情况。@SteveJessop:同意“for”。这就是我在写“这类事情”时的想法;-)“忽略结果”是指在第一个带逗号的语句中,两个表达式a+=3和b=c*2被忽略?是指a不增加3,b不被赋值为c值的两倍?t所有表达式(赋值为表达式)都返回一个结果。表达式
a+=3
3
添加到
a
中,然后返回新值。如果在逗号表达式的左侧使用,则返回的结果将被忽略。@T Singh“忽略结果”与“不求值”不同忽略结果“means”此表达式已完全计算并返回值。我不在乎它返回的值是什么,所以我忽略了它。@qingh:在C标准的语言中,表达式
a+=3
有两个作用。它的主要结果是返回值3。一个副作用是它将3存储在
A
中。这可能看起来很奇怪,因为人类主要使用赋值表达式来表示副作用,而不是主要结果。然而,这就是C标准描述行为的方式。逗号运算符放弃主结果。它不会丢弃副作用。@JoachimPileborg我今天从你们那里学到了一件非常有用但又很新鲜的事情。我有一个想法,就是只有函数“返回”结果。我从来没有想到表达式也会返回值。你和Eric的个人资料显示为C的顶级“回答者”,因此,我没有理由怀疑你所说的&我会把这个关于表情的事实灌输到我的头脑中。