在C中将增量应用于三元运算符

时间:2011-07-26 18:56:09

标签: c increment ternary-operator

我认为三元运算符会根据条件返回:左侧或右侧的值。为什么这段代码打印1?

#include <stdio.h>

int main(int argc, char const *argv[]) {
  int c = 0;
  (c?c:0)++;
  printf("%i", c);
  return 0;
}

3 个答案:

答案 0 :(得分:13)

您似乎有编译器错误,或者可能是语言扩展,因为这不是有效的C.您需要左值才能应用++运算符,而(c?c:0)不是左值。

答案 1 :(得分:0)

我也遇到了一些与此相关的奇怪现象。似乎三元条件的结果可以被视为gcc 3.3.2中的左值,但不是gcc 4.6(我没有更多的版本准备好进一步缩小它)。事实上,使用gcc 4.6编译gcc 3.3.2是不可能的,因为gcc 4.6对构成左值的内容更加挑剔。

另一个不使用gcc 4.6编译的gcc 3.3.2源代码示例:

char *x = ...;
*((void**)x)++ = ...;

gcc 4.6可以将强制转换的结果视为左值并增加它,但gcc 4.6不会。

我也没有相关标准可以发现这是官方标准中发生变化的事情,或者只是gcc在某个阶段允许的事情。

另请注意,C ++允许三元运算符返回左值,但仍然不能递增0.所以这是有效的C ++但不是有效的C:

int c = 0, d = 0;
(c?c:d)++;

答案 2 :(得分:-2)

仅仅因为你在做

(c?c:0)++;

如果你不让“++”发生,你就会得到你想要的东西。

#include <stdio.h>

int main(int argc, char const *argv[]) {
  int c = 0;
  /*  (c?c:0)++;  */
  printf("%i \n", (c?c:0)++ );
  return 0;
}

输出是:

$ gcc -o ternary ternary.c 
$ ./ternary 
0 

gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)