繁体   English   中英

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

[英]Applying increment to ternary operator in C

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

#include <stdio.h>

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

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

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

另一个来自gcc 3.3.2源代码的例子,它不能用gcc 4.6编译:

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

gcc 4.6可以将转换的结果视为左值并将其递增,但gcc 4.6不会。

我也没有相关的标准来发现这是在官方标准中改变的东西,或者只是gcc在某个阶段允许的东西。

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

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

仅仅因为你在做

(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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM