C语言中的布尔表达式

4

我在一个C程序中发现了这个表达式,但是我不理解它:

 struct stack_rec *ss;                                          
 ss=(struct stack_rec *)EMalloc(sizeof(struct stack_rec));       
 if (ss) {                                                      
   int res;                                                     
   res = (ss->elem  = * i , 1); // what does this mean ????
   if (res <= 0)                                                
     return res;                                                
   if (*s == 0) {                                               
     ss->next = 0;                                              
   } else {                                                     
     ss->next = *s;                                             
   }                                                            
   *s = ss;                                                     
   return 2;                                                    
 }                                                              
 return 0;                                                      

这句话的意思是什么?res = (ss->elem = *i,1); 它是一个布尔表达式吗?我试过用0代替1,它总是返回第二个参数的值!请问有人能解释一下这个表达式吗?

我认为 ss->elem = *i 不是 res 的右值。它只是计算并继续到 1(或 0)以获取右值。 - huseyin tugrul buyukisik
可能最初是 res = ss->elem = *i;,然后有人添加了 ,1) 作为一个快速而肮脏的修复方法,并且一直沿用至今。这有意义吗?我们不知道 i 的类型是什么。 - Agent_L
1
一些文档:http://msdn.microsoft.com/en-us/library/zs06xbxh%28v=vs.80%29.aspx http://crasseux.com/books/ctutorial/The-comma-operator.html - maazza
2个回答

9

看起来有问题。这是逗号运算符的使用,它仅评估最终表达式的值,即1

因此,因为那段代码等价于:

ss->elem = *i;
res = 1;

随后对res的测试似乎毫无意义,因此出现了错误。


可能是为了方便调试而设计的。例如,手动将源代码中的字面量“1”更改为“0”以停用某些功能。这是我能想到的唯一原因。 - bitmask
我猜这不是手写的,可能是一个硬扩展宏或其他类型的生成代码。 - dpi

1

你看到的逗号是一个不太常用的C运算符。

基本上,它执行两个语句(ss->elem = *i; 和 1;)。语句1; 实际上并没有什么作用。

之后它返回最后一个语句的结果(在这种情况下为1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接