當前位置:首頁 » 編程語言 » c語言表達式是否容易出現二義性
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言表達式是否容易出現二義性

發布時間: 2022-10-15 22:57:41

『壹』 為了避免這種二義性,C語言規定,else 總是與它前面最近的if配 對,因此對上述例子應按前一種情

這個問題很簡單。就是if 裡麵包含二次判斷,則需要用大括弧標示出來。不然編譯混亂。應該這樣寫。
#include <stdio.h>
int main()
{
int a,b;
printf("輸入兩個數字");
scanf("%d",&a);
scanf("%d",&b);
if (a != b)
{
if (a > b)
printf("第一個比第二個大\n");
else
printf("第二個比第一個大\n");
}
else
printf("兩個一樣的大");
return 0;
}

『貳』 c語言if裡面可以用scanf嗎

C語言if裡面可以用scanf。

scanf_s("%d%d ",&a,&b);去掉裡面的 。

if(a==b)

printf("%d=%d",a,b);

if(a>b)

printf("%d>%d",a,b);

if(a==b)

printf("%d>%d",a,b);

if語句一般形式

if語句中的「表達式」可以是關系表達式、邏輯表達式,甚至是數值表達式。其中最直觀、最容易理解的是關系表達式。所謂關系表達式就是兩個數值進行比較的式子。

if-else 語句引入了一種二義性問題稱為空懸else (dangling-else) 問題,這種問題出現在當if 子句多於else 子句時。問題是這些else 子句分別和哪一個if 子句匹配。

『叄』 計算平方數時不可能引起二義性的宏定義是(C)

宏定義 是字元串的置換替代,當參數是表達式或帶有負號時會引入2義性,所以要多用括弧。
C) #define SQR(x) ((x)*(x)) 不會引入2義性

MA(1+a+b), x 是 1+a+b
x*(x-1) 是 1+a+b*(1+a+b-1),先乘除後加減,
= 1+a + b * (1+1+2-1) = 1+a+b*3
= 1+a + 2*3 = 1+a + 6
=1+1+6 = 8 得8

j=1+a+b = 1+1+2 = 4;
MA(j) 是 j*(j-1) = 4 * (4-1) = 4* 3=12;得12

『肆』 為了避免嵌套的條件語句if-else的二義性,C語言規定:else與 配對.

似乎都不正確,應該是
與之前的還未配對的if配對

『伍』 C語言 表達式 多選題

1) BD
2) ACD
3) BCD
4) AD
5) BD

『陸』 「在C語言算術表達式的書寫中,運算符兩側的運算數類型必須一致」這句話為什麼不對

這是一個明顯的錯誤..
首先,這句話不是對所有的運算符都成立,所以它的概括太盲目性了。舉個例子給你:假如定義一個字元數據a,char c;那麼你可已將一個整形數據賦予給這個字元數據如 c=97,所以賦值預算符的兩側出現了不同的數據類型啊!
這樣的c=97,因為97在ASCII中代表了小寫字母a,所以變數a的賦值相當於c=a

綜上有,你那句話是錯誤的!

『柒』 C語言中,為了避免在嵌套的條件語句if-else中產生二義性,C語言規定:else子句總是與()配對

官方給出的答案是B,這官方真是害人不淺,出題一點都不嚴謹,試問一下,下面的運行結果是什麼,按照官方的答案?

int a = 1, b = 3;

if (1 == a) {

cout << "a:" << a << endl;

if (2 == b) {

cout << "b:" << b << endl;

}

}

else {

cout << "else" << endl;

}


下面的圖是真實的運行結果,這些出題的人,真想把他們拉出來痛打一頓

感覺是他的表達有問題,不應該說是「其之前最近的if」, 這個說法本身就帶有歧義

『捌』 c語言語法的表達式有什麼要求

執行到那一句才有相應的效果,問號表達式可以改寫成if-else:

x = a > b ? i++ : i++;

等同於:

if(a > b)
x = i++;
else
x = i++;

所以最後x等於3,i自增了一次等於4。

為什麼一定要去研究那些沒用的旮旯呢,我從來不記什麼結合方向和運算符優先順序別,對於問號表達式,我只知道:

x = a > b ? i++ : i--;

如果a > b,那麼x = i++,否則x = i--,而整個表達式取了哪一個i的值,那個i的相關副作用運算(如果有的話,比如自增自減)才發生作用。如果你實在想不透就把它改寫成上面那樣的if-else語句,一目瞭然,沒必要學孔已己樣咬文嚼字在那些拐角旮旯里浪費時間。

BTW:你們的考試考運算符結合方向?天......

『玖』 c++中的二義性是什麼意思

二義性問題

  1. 在繼承時,基類之間、或基類與派生類之間發生成員同名時,將出現對成員訪問的不確定性——同名二義性。

  2. 當派生類從多個基類派生,而這些基類又從同一個基類派生,則在訪問此共同基類中的成員時,將產生另一種不確定性——路徑二義性。

例子:

一、同名二義性

基類B1和基類B2都存在一樣的成員函數Say,派生類C同時繼承了B1和B2,這時候如果C的對象使用Say的時候就無法確定該調用哪個基類的Say了。

classB1{
public:
voidSay();//定義Say
}
classB2{
public:
voidSay();//定義Say
}
classC:publicB1,publicB2{//同時繼承自B1,B2
}
Cc;
c.Say();//無法確定該調用B1的Say還是B2的Say

二、路徑二義性

存在一個祖宗類P,P有成員函數Say。兩個基類B1和B2都繼承自P,派生類C同時繼承了B1和B2。這時候如果C的對象訪問Say的時候就無法確定是調用B1的基類P還是B2的基類P。

classP{
voidSay();//定義Say
}
classB1:publicP{//繼承自P
}
classB2:publicP{//繼承自P
}
classC:publicB1,publicB2{//同時繼承自B1,B2
}
Cc;
c.Say();//無法確定該通過B1還是B2調用Say

『拾』 c++解決二義性的方法

B.
初看題目,答案應該在BC之間.
我就只解釋錯誤的了.
假設:
基類中有方法void Cool(int i)
派生類中也有方法void Cool(int i)
實際運行中派生類的Cool方法會覆蓋基類中的同名方法.
因為基類的Cool方法並沒有消失,仍然可以通過其他途徑調用.
所以,這樣編寫代碼時很容易造成混淆(二義性).