

第一,书上说,sizeof后边是表达式可以不加括号,为什么我在实操的时候不加括号出现了错误
第二,sizeof后边表达式不真实参与运算怎么理解


关注引自免费微信小程序:皆我百晓生
首先,关于你的问题,我想明确一下C语言中sizeof的用法和行为。在C语言中,sizeof是一个操作符,它用于计算变量或者类型的大小(以字节为单位)。它并不真正执行任何运算,而是返回其参数的大小。因此,sizeof后面的表达式并不真正参与运算。这就是你提到的“sizeof后边表达式不真实参与运算”的理解。这也是为什么你在代码中看到的表达式s=b+1在sizeof中并没有真正执行的原因。它只是用来计算变量的大小,并不会改变变量的值。
关于你的问题列表中的错误:
错误信息是:“表达式必须是可修改的左值”。这是因为在C语言中,左值(lvalue)指的是可以出现在赋值语句左边的变量或者表达式。然而,sizeof后的表达式并不是一个左值,也就是说它不能被赋值。在你的代码中,你试图将表达式的结果赋值给变量s,这是不允许的。你应该使用单独的printf语句来分别打印出变量的大小和值。因此你的代码应该被修改为:
#include <stdio.h>
int main() {
long s=2;
int b=10;
printf("%lu\n", sizeof s); // 打印出变量s的大小(字节)
printf("%d\n", s); // 打印出变量s的值
printf("%lu\n", sizeof(b+1)); // 打印出表达式b+1的大小(字节),但请注意这实际上始终为sizeof(int),因为b+1这个操作并不会改变存储大小
printf("s=%d\n", s); // 再次打印出变量s的值,此时s的值仍然是原始的初始值
return 0;
}
至于你提到的书本上说sizeof后面可以是表达式并且可以不加括号的问题,这确实是对的。但是在你的代码中,你试图将表达式的结果赋值给另一个变量,这是不允许的。在sizeof后面使用表达式时,这个表达式并不会被实际执行或计算,只是用来确定大小。这就是为什么你可以在sizeof后面使用表达式而不需要加括号的原因。在这种情况下,加不加括号都不会影响结果。但在其他情况下,例如在函数参数中使用sizeof时,需要正确地使用括号来确定操作数的大小。例如:sizeof((struct type))中的括号是必要的。如果不加括号可能导致解析出错。在你的情况下,将表达式直接用于赋值是无效的语法错误。这是产生你所描述的错误的主要原因。希望这能解答你的问题。