查看this个问题并try 一些代码:

int x = 100;

while ( 0 <-------------------- x )
{
    printf("%d ", x);
}

我try 用gcc编译,得到以下错误:

file.c: In function 'main':
file:c:10:27: error: lvalue required as decrement operand
 while ( 0 <-------------------- x )

而是用g++件作品汇编而成.为什么这段代码在C++中有效,但在C中无效?

推荐答案

在C中,--x是一个值,而不是左值.其效果是递减x,并计算为新指定的值x.因为--x不是左值,所以不能递减.

在C++中,--x是左值,而不是右值.它的作用是递减x,并作为左值计算为x.由于--x再次是左值,因此可以再次递减.

为什么C++中的--x是LValk的原因是因为C++引入了引用类型.鉴于

void f(int &);
int i;

调用f(--i)可能是有意义的,它在递减后通过引用传递i.

因为C没有引用类型,所以--i作为左值没有什么意义.从历史上看,它从来都不是,而且与C++不同,C从未获得改变规则的令人信服的理由.

请注意,C++需要进行更广泛的更改,而不是将左值设为--x才能真正使其正常工作.将--x设为左值,而不做任何其他操作,将导致--x个未定义的行为,因为在对x的修改和随后的左值到值的转换之间将不存在顺序点.对----x人来说更是如此.C++必须修改排序规则才能使其工作.在C语言中,对排序规则的修改可能会给现有编译器带来遵守新规则的问题,因此这种修改很可能会被拒绝,除非有很大的好处.

C++相关问答推荐

AVX-512 BF 16:直接加载bf 16值,而不是从fp 32转换

如何从TPS特定的TGPT_PUBLIC数据 struct 中以OpenSSL的EVP_PKEY

想了解 struct 指针和空指针转换

理解没有返回语句的递归C函数的行为

字符串令牌化xpath表达式

如何判断宏参数是否为C语言中的整型文字

在#include中使用C宏变量

有没有可能我不能打印?(C,流程)

为什么net/if.h在ifaddrs.h之前?

使用双指针动态分配和初始化2D数组

Sizeof(&Q;字符串&Q;)的正确输出是什么?

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

用C++从外部ELF符号读取值

在C++中父进程和子进程中的TAILQ队列同步问题

如何在C中用bool进行文件I/O?

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

try 判断长整数是否为素数

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

C 中从 Unix 纪元时间转换的损坏